0

我在 Scala-IDE 中有以下代码:

type myF = () => Boolean

def acceptFunction(f: myF) {
  //...
}

接着:

var a = false

def isA = () => a

但是当我尝试将它传递给acceptFunction时,它会导致错误:

acceptFunction(isA)

错误是:

类型不匹配; 发现 : () => 需要布尔值:布尔值

但为什么?

如果我isA这样声明:

def isA() = () => a

然后它被接受,但我认为,它会因为括号而被评估。

有没有办法通过这样的功能进行进一步评估?

更新:

看起来它与Scala-IDE有关。REPL 对这些表达式没有任何问题。但是,我仍然无法使传递的函数不会变成闭包。我的意思是,它变成了闭包,然后更改var a后者并println(f())再次调用示例 - 不会更改值。所以,问题的第二部分仍然存在——有没有办法通过这样的函数进行进一步的评估?

4

1 回答 1

1

您确定第一次编写代码时没有犯错吗?我将您所拥有的内容复制并粘贴到 2.9.1 REPL 中,它运行良好。

scala> type myF = () => Boolean
defined type alias myF

scala>  var a = false
a: Boolean = false

scala> def isA = () => a
isA: () => Boolean

scala> def acceptFunction(f: myF) {println(f())}
acceptFunction: (f: () => Boolean)Unit

scala> acceptFunction(isA)
false

scala>

更新: isA定义它时是一个闭包。传递给它对它acceptFunction是否抓取没有影响a

您的目的是编写一个函数 ,acceptFunction它接受一个函数 ,f,它在定义时捕获一个外部值 ,a

你可以这样做:

// Defines a function which returns a function with returns the 
// value that was captured at the outer function's call time.
def isB = { (b: Boolean) => { () => b }: myF }

a = true

val f = isB(a)

acceptFunction(f) // >> true

a = false

acceptFunction(f) // >> true

那是你想去的地方吗?

于 2012-04-11T14:40:24.640 回答