gpt4 book ai didi

scala - 带有闭包/高阶函数/方法的简单 Scala Mind Bender

转载 作者:行者123 更新时间:2023-12-02 07:30:11 27 4
gpt4 key购买 nike

当我注意到下面的代码无法编译时,我正在玩 Scala,为什么?

case class A(a:Int) {
def getA: ()=>Int = () => a
def getAA()=a
def getAAA=a
}

object Test extends App{
val a =A(3)
def printInt(f:()=>Int)=println(f())
printInt(a.getA) // fine, prints 3
printInt(a.getAA) // fine, prints 3
printInt(a.getAAA) // this does not compile, why ?
}

a.getA、a.getAA 和 a.getAAA 之间有什么区别?

最佳答案

当你定义一个没有括号的def时,你定义它类似于val。这意味着,它必须在没有括号的情况下调用(否则它们将是可选的)。 a.getAAA 的类型为 Int

当您用(空)圆括号定义 def 时,在调用方端使用圆括号是可选的除非它被用在函数也是有效的。然后将不带括号的变体作为函数。

简而言之,可能有以下类型:

scala> a.getAAA : Int
res: Int = 3

scala> a.getAA() : Int
res: Int = 3

scala> a.getAA : Int
res: Int = 3

scala> a.getAA : (() => Int)
res: () => Int = <function0>

不可能的是:

scala> a.getAAA() : Int
<console>: error: Int does not take parameters
a.getAAA() : Int
^

scala> a.getAAA : (() => Int)
<console>:11: error: type mismatch;
found : Int
required: () => Int

scala> a.getAA() : (() => Int)
<console>: error: type mismatch;
found : Int
required: () => Int

如果您想在函数上下文中使用 getAAA,可以使用 printInt(a.getAAA _) 将其设为临时函数。

关于scala - 带有闭包/高阶函数/方法的简单 Scala Mind Bender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22715464/

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