我想创建一个函数与下面的签名元组:转换由名称参数
def myFunction[T](functionWithName: (String, => T)): T
,这样我可以调用它,例如,像这样:val x = myFunction("abc" -> 4 * 3)
。但是,Tuple不接受名称参数,所以上面的签名是无效的。
通过this answer的启发,我想下面的隐式转换:
implicit class ByName[T](getValue: => T) extends Proxy {
def apply(): T = getValue
def self = apply()
}
def myFunction[T](functionWithName: (String, ByName[T])): T = {
// do something
functionWithName._2()
}
隐含不会在这种情况下工作,但是(不像在链接的答案)。
- 为什么隐式转换为
ByName
不起作用? - 如何才能达到
myFunction("abc" -> 4 * 3)
的名称所要传递4 * 3
的预期效果?
为什么一个元组,什么是错的2个参数? –
@ insan-e实际上会有myFunction的多种变体。它可以称为'myFun(“a” - > 1 * 2,“b” - > 3 * 4)“或myFun(”a“ - > 1 * 2,”b“ - > 3 * 4” c“ - > 5 * 6)'等等。因为可能有很多参数,所以我想避免任何不必要的语法来保持它的可读性。 – Mifeet
我明白了。你不能这样做,可能是因为[元组](https://github.com/scala/scala/blob/v2.12.3/src/library/scala/Tuple2.scala#L19)有热烈的争论。我看到的唯一方法是按名称创建整个元组,'functionWithName:=>(String,T)'... –