Kotlin 中的命名参数
参数是可以传递给方法的值。然后该方法可以使用该参数,就好像它是一个局部变量,该变量使用调用方法传递给它的变量的值进行初始化。函数参数使用 Pascal 表示法定义 - 名称:类型。参数使用逗号分隔,并且每个参数必须显式键入:
fun powerOf(number: Int, exponent: Int): Int { /*...*/ }
例子
Kotlin 中的命名参数允许我们在传递给函数时明确命名参数。这样做的好处是,对于具有许多参数的函数,显式命名可以明确每个参数的意图。这使调用站点更具可读性。在以下示例中,我们检查第一个字符串是否包含第二个字符串的子字符串:
val string = "a kindness of ravens"
string.regionMatches(14, "Red Ravens", 4, 6, true)
要使用命名参数,我们将参数名称放在参数值之前。这里再次调用函数,这次使用命名参数:
string.regionMatches(thisOffset = 14, other = "Red Ravens",
otherOffset = 4, length = 6, ignoreCase = true)
第二个示例以更冗长为代价更易读,但现在很清楚每个参数的含义。您可能已经猜到是区分大小写的最后一个布尔值现在很明显了。如果您没有命名参数,则必须查看文档或源代码。另一个好处是,对于具有多个相同类型参数的函数,由于值可以与名称相关联,因此出错的可能性较小。在下一个示例中,您将看到该函数如何接受多个布尔参数。如果没有命名参数,很容易错误地交换参数:
fun deleteFiles(filePattern: String, recursive: Boolean, ignoreCase:
Boolean, deleteDirectories: Boolean): Unit
比较调用此函数的两种不同风格:
deleteFiles("*.jpg", true, true, false)
deleteFiles("*.jpg", recursive = true, ignoreCase = true,deleteDirectories = false)
您是否注意到第一个参数没有命名,即使其他参数也没有命名?调用函数时,并非所有参数都需要命名。规则很简单:一旦一个参数被命名,后面的所有参数也必须被命名。命名参数还允许更改参数顺序以适合调用者。例如,以下两个示例是等价的:
val string = "a kindness of ravens"
string.endsWith(suffix = "ravens", ignoreCase = true)
string.endsWith(ignoreCase = true, suffix = "ravens")
为什么这很有用将在下一节关于默认参数的部分中演示。更改参数的顺序允许我们有选择地选择要覆盖的默认参数。
结论
命名参数只能用于 Kotlin 定义的函数,而不能用于 Java 定义的函数。这是因为Java代码在编译成字节码时并不总是保留参数名称。