我在理解Scala中传递函数作为参数方面遇到了一些麻烦。这就是我正在做的事情:
class Foo1(f:Foo2) {
def getFunResult(result:Foo2 => Int) = result
}
case class Foo2(bar:Int)
val a = Foo2(3)
println( new Foo1(a).getFunResult(_.bar) )
但这只打印出来:<function1>
而不是3
如何让..getFunResult(_.bar)
向我提供结果3
?
答案 0 :(得分:2)
您永远不会将要传递的功能应用于getFunResult
。试试这个
class Foo1[A](a: A) {
def getFunResult(result:A => Int) = result(a)
}
case class Foo2(bar:Int)
val a = Foo2(3)
println( new Foo1(a).getFunResult(_.bar) )
答案 1 :(得分:2)
因为getFunResult
会返回参数,而不会对其执行任何操作
result
是一个带有签名A => Int
的参数,意味着一个可以接受任何值并返回整数的函数。同样,getFunResult的签名也是A => Int
而不是Int
,正如您所期望的那样;这是因为你实际上没有调用函数,你只是将它返回。
为了调用它你需要一个参数,一个很好的例子是这样的:
def eval[A,B](f: A => B, a: A): B = f(a)
def eval[A,B](f: A => B) = f
def isEven(a: Int): Boolean = a % 2 == 0
// returns false
eval(isEven, 3)
// returns <function1> because the function you passed didn't have any parameter
eval(isEven)
解决问题的方法是:
class Foo1[A](a: A) {
// it's good practice to include the return type in methods,
// that way you're sure to get a compiler error in case you make a
// mistake like the one you did
def getFunResult(result: A => Int): Int = result(a)
}
case class Foo2(bar:Int)
val a = Foo2(3)
println( new Foo1(a).getFunResult(_.bar) )