获取函数结果而不是“<function1>”</function1>

时间:2014-07-17 20:23:38

标签: scala

我在理解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

2 个答案:

答案 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) )