我在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())
调用示例 - 不会更改该值。所以,问题的第二部分仍然存在 - 有没有办法通过这样的功能进行评估?
答案 0 :(得分: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>
UPDATE: 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
那是你要去的地方吗?