2013-05-02 64 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 

具有明显的下行变化明确的包装层级的。

这可以通过该方法中的包装和包装类型之间的隐式转换得到缓解,但它仍然是一个有点笨拙,尤其是对于非常紧凑的辅助功能......

当然一切都简化了,当你的方法的返回类型更具体而且隐含冲突的概率非常低。