将成员函数作为参数传递给scala

时间:2013-12-27 03:35:26

标签: scala

我正在尝试实现几个函数,它们将采用两个相同类型的对象[A],一个阈值,在两个对象上调用类型[A]的成员函数,将结果与阈值进行比较以返回布尔值。

作为一个具体的例子,比方说,[A]有几个返回int s的成员函数。我更喜欢创建一个函数工厂,它接受这样一个成员函数,fn,两个对象,a和b,类型为[A],阈值为thresholdFn,并返回一个函数,其主体为(a.fn + b) .fn> thresholdFn)。是否可以创建一个工厂fn,如:

def myFn(
    a: MyObject,
    b: MyObject,
    getter: <<<MyObject getter function>>>,
    int threshold): Boolean = {
  def myFn1(...) {
  (<<< a.getter + b.getter >>>)  > threshold
  }
  myFn1
}

[A]是一个外部Java类。

1 个答案:

答案 0 :(得分:2)

你不能以这种方式做到这一点。您可以创建一个函数并使用它:getter(a)

def myFn(a: MyObject, b: MyObject, getter: MyObject => Int, int threshold): Boolean = {
  (getter(a) + getter(b))  > threshold
}

用法:

myFn(a, b, _.fn, threshold)

如果您要抽象ab类型,则应将getter移至其他参数组:

def myFn[T](a: T, b: T, int threshold)(getter: T => Int): Boolean = {
  (getter(a) + getter(b))  > threshold
}

myFn(a, b, threshold){ _.fn }