2009-09-25 82 views
1

鉴于这种代码:你可以在scala中返回一个未评估函数吗?

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

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

我怎么能返回应用FooFuncparam没有评价呢?我想这样做的原因是,因为FooFunc,你可以看到,依赖于一个外部变量,所以我想能够用param调用它已经应用。 getFunc的退货类型需要什么?

回答

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 
1

您可以添加另一个void参数,以便函数仅在应用于此参数时进行评估。

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

1

我敢肯定有很多选择,但你可以使用:

return { Unit => FooFun(param) } 
5

简单:

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

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

相关问题