鉴于有一个函数foo[A, B, C]( func: (a: A, b: B, c: C) => B)
,我想传入这个函数def secondOfThree[A, B, C](a: A, b: B, c: C): B = b
我可以使用foo
来调用foo(secondOfThree)
这很难看,但工作正常。但是,我希望能够使用{{1}的内容来调用foo
但是这不起作用。
那么创建简单的未命名提取函数的干净惯用scala方法是什么?
答案 0 :(得分:4)
您不需要case
关键字,但Scala 需要知道类型:
scala> def foo[A, B, C](func: (A, B, C) => B) = ...
foo: [A, B, C](func: (A, B, C) => B)Nothing
scala> foo[Symbol, Int, Char]((_, b, _) => b)
如果foo
知道类型,则调用不需要指定它们:
scala> def foo(func: (Symbol, Int, Char) => Int) = func('a, 2, 'c') + 5
foo: (func: (Symbol, Int, Char) => Int)Int
scala> foo((_, b, _) => b)
res3: Int = 7
答案 1 :(得分:2)
因此,如果可以推断出类型,那么你可以做到最简单:
class Trio[A, B, C](a: A, b: B, c: C) {
def foo(func: (A, B, C) => B): B = func(a, b, c)
}
println(new Trio(1, "string", 'Symbol).foo((_, b, _) => b))