【问题标题】:Kotlin: how to make a function call using the first argument's default value and passing a value for the second?Kotlin:如何使用第一个参数的默认值进行函数调用并为第二个参数传递一个值?
【发布时间】:2016-04-24 02:37:28
【问题描述】:

当您想指定第二个参数的值时,我想知道如何使用默认参数调用函数。在下面的简单示例中,我展示了 addTwo() 接受两个参数。 'first' 参数有一个默认值,但 'second' 没有。我如何调用这个函数来指定我想使用“first”的默认值和“second”的给定值 2?

调用 addTwo(2) 会引发错误。

fun main(args: Array<String>) {
    var sum = addTwo(1,2)    // works fine
    var nextSum = addTwo(2)  // ERROR: No value passed for parameter second 
}

fun addTwo(first: Int = 0, second: Int): Int {
    return first + second
}

【问题讨论】:

  • 您应该将错误消息文本添加到问题中,因为它很重要并且准确地说明了错误是什么。 "没有为参数 SECOND 传递值"
  • 我在编辑中添加了错误消息。并固定缩进。
  • 对你学习 Kotlin 的附注,使用 val 除非你在特定情况下绝对需要使用 var,它不应该是默认值。 val 是你的朋友。

标签: kotlin default-arguments


【解决方案1】:

这是一个错误,因为 Kotlin 不知道您为什么省略了第二个参数。 first 可以默认,但second 不能。因此,当您只传递一个参数时,它是参数first。错误消息准确地说明了问题所在:

没有为参数second传递值

您必须使用named arguments 调用您想要留空的第一个默认参数之后的任何内容。对于您的情况,这将是:

addTwo(second = 2) // first defaulted to 0

如果你的默认参数是另一个顺序,你的调用就可以了。

fun addTwo(first: Int, second: Int = 0): Int{
    return first + second
}

addTow(2)  // no error, second defaulted to 0

如果您的两个参数的数据类型不同,您会看到不同的不太清楚的错误,让您知道第一个参数的类型 (Int) 是预期的,而不是第二个参数的类型 (Date在以下示例中):

fun something(first: Int = 0, second: Date): Date { ... }

something(Date()) // ERROR: Type mismatch: inferred type is java.util.Date but kotlin.Int was expected

注意: vararg 可能会遇到同样的问题:

只有一个参数可以标记为可变参数。如果可变参数不是列表中的最后一个参数,则可以使用命名参数语法传递以下参数的值

【讨论】:

    【解决方案2】:

    附加说明:根据您的经验,将默认参数设置为列表中的最后一个参数通常是最佳做法。一些语言甚至强制这样做,例如 Python(除了 Python 允许在默认值之后强制命名参数,因为强制你按名称调用它们是无论如何在默认参数之后使用参数的方式)。

    【讨论】:

    • 当你有很多默认参数时,你开始更多地使用命名参数,然后顺序就不再重要了,因为无论如何你都必须开始使用命名参数来跳过一些默认参数。
    • 您不一定要强迫您的函数的用户必须学习更多的 api,有时使用命名参数最终会使您的代码变得混乱。另外,强制命名参数意味着如果其他人正在使用该函数,您肯定无法重构名称。默认值和命名参数有时间和地点。通常,将默认值放在列表末尾会更安全。我知道 我的 头脑更容易在列表末尾环绕默认值,尤其是当它们用作标志时。
    猜你喜欢
    • 2019-03-26
    • 2012-05-22
    • 1970-01-01
    • 2017-12-12
    • 2018-07-20
    • 2020-05-25
    • 2019-10-19
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多