你能在scala中返回一个未评估的函数吗?

时间:2009-09-25 16:38:10

标签: scala

鉴于此代码:

def getFunc(funcName:String, param:Int) = match funcName {
  case "FooFunc" => FooFunc(param)
  [...]
}

def FooFunc(param:Int) = param + SomeObject.SomeVariable

我如何在申请FooFunc的情况下退回param不用评估呢?我想要这样做的原因是因为你可以看到FooFunc依赖于一个外部变量,所以我希望能够在已经应用param的情况下调用它。 getFunc的返回类型需要什么?

4 个答案:

答案 0 :(得分:5)

易:

def getFunc(funcName: String, param: Int) = funcName match {
  case "FooFunc" => () => FooFunc(param)
  [...]
}

你的方法有一个好名字:getFunc应该返回一个函数,所以它会。

答案 1 :(得分:2)

必须在Scala中的调用站点定义惰性。你可以这样做:

lazy val x = getFunc(...) // getFunc only gets evaluated when needed

或者您可以更改签名:

def FooFunc(param:Int) = () => param + SomeObject.SomeVariable
...
val x = getFunc(...) // x contains a function from Unit into something

x() // Use x here, causing the evaluation

答案 2 :(得分:1)

您可以添加另一个void参数,因此仅在将该函数应用于此参数时对其进行求值。

虽然在这种情况下我宁愿使用适当的对象而不是函数。

答案 3 :(得分:1)

我确定有很多选择,但您可以使用:

return { Unit => FooFun(param) }