在Scala中将方法作为参数传递

时间:2014-03-28 16:04:04

标签: scala

这似乎应该相当简单,但我无法弄清楚如何编写它。

我喜欢以下功能,可以找到max的{​​{1}}或min

seq

但我不想将def maxOrMin_1(seq: IndexedSeq[Int], maxMin: IndexedSeq[Int] => Int): Int = maxMin(seq) 作为函数,而是希望它是maxMin的方法,以便我可以写:

IndexedSeq

但是编译器说def maxOrMin_2(seq: IndexedSeq[Int], maxMin: IndexedSeq[Int] => Int): Int = seq.maxOrMin

此外,当我尝试调用value maxOrMin is not a member of IndexedSeq[Int](假设我可以弄清楚如何编写它)时:

maxOrMin_2

我收到编译器消息:maxOrMin_2(IndexedSeq(1, 2, 3), IndexedSeq.max)

我很高兴知道如何写这些。感谢。

更新:我刚刚发现我可以解决这样的通话问题。

value max is not a member of object IndexedSeq

这让我感到有点罗嗦。但除非有更好的方法,否则我猜它会做。

更新:现在,我知道如何调用它,maxOrMin_2(IndexedSeq(1, 2, 3), (xs: IndexedSeq[Int]) => xs.max) 正常工作。

maxOrMin_1

有没有比这更好的答案?

1 个答案:

答案 0 :(得分:0)

直接简单地调用maxmin方法会更容易,而不是通过函数调用。所以而不是:

val input = IndexedSeq(1, 2, 3)

maxOrMin_1(input, (xs: IndexedSeq[Int]) => xs.max)
maxOrMin_1(input, (xs: IndexedSeq[Int]) => xs.min)

你直接打电话:

input.max
input.min

如果您仍然需要原始函数,可以通过currying(输入和函数的单独参数列表)使调用更简洁,这会在Scala中产生更好的类型推断:

def maxOrMin_1(seq: IndexedSeq[Int])(maxMin: IndexedSeq[Int] => Int): Int = maxMin(seq)

然后打电话如下:

maxOrMin_1(input)(_.max)
maxOrMin_1(input)(_.min)