【问题标题】:Scala: function with no argumentsScala:没有参数的函数
【发布时间】:2016-11-03 22:51:37
【问题描述】:

我对 scala 函数相对较新,我对这种语法糖的实际工作方式以及何时使用特定类型感到困惑。

我已经编写了 3 个函数,它们都应该做同样的事情,但是我无法理解为什么 Function0 的行为不同

版本 1

val fn1 : (String) => String = System.getProperty(_)

println(fn1("os.name"));

第 2 版

  val fn2 : () => String = System.getProperty("os.name")

  println(fn2());

版本 2 给出类型不匹配;发现:需要字符串:() ⇒ 字符串

第 3 版

val fn3 = () => System.getProperty("os.name")

println(fn3());

我知道对于版本 2,scala 已经知道 System.getProperty 的返回类型,但是为什么它会产生那个特定的错误,为什么它会阻止我明确说明返回类型。我个人更喜欢显式返回类型,因此我不必深入研究方法来查看它返回的内容。

【问题讨论】:

    标签: scala lambda


    【解决方案1】:

    val fn2 : () => String = System.getProperty("os.name") 中,System.getProperty("os.name") 将被执行并返回一个字符串值。但是你说fn2 是一个值,它是一个不带参数并返回一个字符串的函数。

    当你做System.getProperty(_)时,就像在做x => System.getProperty(x),这是一个接受一个字符串并返回一个字符串的函数。这就是第一个版本有效的原因。

    【讨论】:

    • 抱歉,如果第二个函数被解释为“一个值,这是一个不带参数并返回字符串的函数。第一个函数不会以类似的方式读取方式,即返回一个函数,该函数接受一个字符串并返回一个字符串。相反,编译器发现你想返回一个字符串而不是一个函数。
    【解决方案2】:

    此版本将进行类型检查:

    val fn2 : () => String = () => System.getProperty("os.name")
    

    在这里调用fn2()就像调用:

    def fn2(): String = System.getProperty("os.name")
    fn2()
    

    在您的 fn1 示例中,下划线提供了这种隐式语法,它看起来更像您在空参数情况下所需要的:

    val fn1 : (String) => (String) = (s) => System.getProperty(s) 
    

    【讨论】:

    • defs 是方法,不是第一类对象,与 FunctionN 相反。所以val fn2: () => Stringdef fn2(): String绝对不是一回事。
    • 为清楚起见,编辑了我的答案。在 OP 的示例中,我编写的两个模型是等效的。 defs 不能作为对象传递,但我觉得这个比较还是有帮助的。
    猜你喜欢
    • 2019-04-12
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多