gpt4 book ai didi

scala - 不带参数的函数,以单位作为 Scala 中的参数

转载 作者:行者123 更新时间:2023-12-03 07:52:42 27 4
gpt4 key购买 nike

def foo(x: Int, f: Unit => Int) = println(f())

foo(2, { Unit => 3 + 4 })

// case 1
def loop: Int = 7
foo(2, loop) // does not compile

changing loop to
// case 2
def loop(): Int = 7
foo(2, loop) // does not compile

changing loop to
// case 3
def loop(x: Unit): Int = 7 // changing according to Don's Comments
foo(2, loop) // compiles and works fine

不应该 case 1case 2也工作?为什么他们不工作?

将 foo 定义为
def foo(x: Int, y: () => Int)

然后 case 2有效但无效 case 1 .

他们不是都应该工作吗,以任何一种方式定义功能?

我也觉得 () => Int in foo 是一种糟糕的风格, y:=> Int不起作用。注释?

最佳答案

Scala 区分以下几点:

  • 没有参数列表的函数/方法(如果是函数,则为“按名称参数”)
  • 具有一个空参数列表的函数
  • 具有一个单位类型参数的函数

  • 这些都不是等价的,尽管为方便起见,Scala 允许您省略空参数列表。 (顺便说一下,两个空参数列表也不一样。)

    所以,即使 Unit写的是 () , 这与函数参数括号 () 不同用于函数或方法。相反,想想 ()作为 Tuple0 .

    所以,如果你说 f: Unit => Int ,你的意思是“f 采用一个参数,但它是一个非常无聊的参数,因为它是 Unit ,它必须始终是相同的无聊 Tuple0() ”。你写的东西真的很短 f: (Unit) => Int .

    如果你说 f: () => Int ,那么您的意思是“f 不接受任何参数并产生 Int”。

    如果你说 f: => Int ,那么您的意思是“延迟执行任何语句会产生 Int 值,直到我们在此代码中使用它(并每次重新评估它)”。在功能上,这最终与 f: () => Int 基本相同(并且在内部转换为相同的 Function0 类),但它有不同的用法,大概是为了允许更紧凑的闭包形式(您总是在调用代码中省略 =>)。

    关于scala - 不带参数的函数,以单位作为 Scala 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2774516/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com