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

this 可以去掉内部函数定义,但是有一个问题,看我是否需要调用lookup里面 的函数encode,并且lookup还带了String类型的隐式参数,implicit result:String = ""隐式传递给lookup函数。

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

我不希望这种情况发生,有没有办法限制隐式参数在lookup该函数之外解析?还是其他更好的想法?

4

3 回答 3

2

如何使用普通的默认参数,然后在实现中显式传递累加器:

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

// call
encode(my_tree, my_text)
于 2013-05-02T17:36:47.157 回答
0

你的想法很好,但不鼓励使用这种通用类型的隐式参数,以免你陷入隐式定义冲突(例如,在你的范围内有太多隐式Strings可见)。

IIRC,Martin 的书特别提到了这些问题。

您可以在 String 周围定义一个显式的 Wrapper 层次类,其类型会随每个特定方法而变化

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

明显的缺点是您需要在方法主体中“包装/解包”字符串。

这可以通过方法中包装器和包装类型之间的隐式转换来缓解,但它仍然有点笨拙,特别是对于非常紧凑的辅助函数......

当然,当您的方法的返回类型更具体并且隐式冲突的概率变得非常低时,一切都会简化。

于 2013-05-02T17:25:03.143 回答
0

您是否考虑过lookup在该场景中显式提供隐式。像这样:

def encode(tree : Tree, text: String)(implicit result:String = "" ):String = {
  lookup(tree, text)("other string")
}
于 2013-05-02T16:38:02.833 回答