2013-05-02 65 views
0

我經常發現我需要寫有內遞歸輔助函數功能,它採用相同的參數列表外的功能,但只有一個附加蓄能器的參數:限制隱含參數解析範圍

def encode(tree : Tree, text: String):String = { 
    def rec(tree: Tree, text:String, result:String):String = ??? 

    rec(tree, text, "") 
} 

我想爲了簡化這個:

def encode(tree : Tree, text: String)(implicit result:String = ""):String 

這可以消除內部函數的定義,但它有一個問題,看看我是否需要調用一個函數lookupencodelookup還帶有String類型的隱式參數,implicit result:String = ""隱式傳遞給lookup函數。

def lookup(tree : Tree, text: String)(implicit result:String = ""):String 

我不希望這種情況發生,有沒有辦法來限制從解決該函數的外lookup的隱含參數?或者其他更好的想法?

+1

我的直覺告訴我,這是不是一個很好的利用隱含參數列表......不幸的是,我無法解釋或證明直覺。 – 2013-05-02 16:54:29

+0

@RandallSchulz Martin在PIS 2nd P494中使用了這種模式。 'maxListImpParm'示例,基本上就是說,該方法有一些我想傳遞的附加信息,這裏的信息是一個累加器。這裏的問題不是這種模式,它發生在任何你有隱含參數的地方,它只是隱含地傳遞,有時這違背了我的意圖,如果'lookup'沒有被我定義,我可能不知道,參數曾經通過到它。 – Sawyer 2013-05-02 17:03:45

回答

2

如何使用正常的默認參數,而不是再明確地傳遞蓄能器中執行:

def encode(tree : Tree, text: String, result : String = ""): String = { 
    //snip 
    encode(new_tree, new_text, new_result) 
} 

// call 
encode(my_tree, my_text) 
+0

我以爲默認參數不能省略。我的錯誤〜 – Sawyer 2013-05-02 20:53:10

+0

@Sawyer然後有一個默認參數有什麼意義? – gzm0 2013-05-02 20:57:00

+0

問題是API調用方沒有提供累加器,並且該方法可能是遞歸的而沒有幫助函數。 – Sawyer 2013-05-03 17:51:42

0

您是否考慮過在該場景中明確提供暗示給lookup。像這樣:

def encode(tree : Tree, text: String)(implicit result:String = ""):String = { 
    lookup(tree, text)("other string") 
} 
+0

我可以這樣做,但「lookup」隱式參數的目的之一是讓它在沒有第二個參數列表的情況下調用,也不應該這樣做,否則我只會將其定義爲普通參數。目前我做的和你的建議一樣,只是想知道是否有更好的方法。 – Sawyer 2013-05-02 16:44:18

0

你的想法是好的,但使用這種通用型的隱含參數是不鼓勵,免得你(在你的範圍例如太多隱含Strings可見)跌入隱含概念上的衝突。

IIRC,馬丁的書專門提到這樣的問題。

你可以定義在你的字符串,其類型,你需要「包裝/解包」中的方法體字符串爲每個特定的方法

abstract class Wrapper[A](value: A) { def apply(): A = value } 

case class EncodeWrapper[A](value: A) extends Wrapper(value) 
case class LookupWrapper[A](value: A) extends Wrapper(value) 

def encode(tree : Tree, text: String)(implicit result: EncodeWrapper[String] = EncodeWrapper("")):String 

def lookup(tree : Tree, text: String)(implicit result: LookupWrapper[String] = LoodupWrapper("")):String 

具有明顯的下行變化明確的包裝層級的。

這可以通過該方法中的包裝和包裝類型之間的隱式轉換得到緩解,但它仍然是一個有點笨拙,尤其是對於非常緊湊的輔助功能......

當然一切都簡化了,當你的方法的返回類型更具體而且隱含衝突的概率非常低。