【发布时间】:2018-03-30 13:50:53
【问题描述】:
我想创建一个具有以下签名的函数:
def myFunction[T](functionWithName: (String, => T)): T
这样我就可以调用它,例如:val x = myFunction("abc" -> 4 * 3)。但是,Tuple 不接受 by-name 参数,所以上面的签名是无效的。
受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)等。因为可能有很多参数,我想避免任何不必要的语法以保持可读性。 -
我明白了。你不能这样做可能是因为tuples 有急切的论据。我看到的唯一方法是按名称制作整个元组,
functionWithName: => (String, T)... -
我喜欢这样,一个优雅的解决我的问题。它不能在所有情况下使用(例如,当需要在 T 之前评估 String 时),但可以在其他情况下使用。如果这是一个答案,会投票赞成。
标签: scala implicit-conversion callbyname