我想創建一個函數與下面的簽名元組:轉換由名稱參數
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)'... –