我正在阅读Scala WartRemover工具的描述,并对他们的一个观点感到困惑。描述是这样说的:
return
破坏了引用透明度。重构以终止 以安全的方式进行计算。// Won't compile: return is disabled def foo(n:Int): Int = return n + 1 def foo(ns: List[Int]): Any = ns.map(n => return n + 1)
这对我来说没有任何意义,这两个例子看起来都是透明的。是否有某种方式使 return
关键字更有可能使函数破坏引用透明度?我只是完全误解了他们的意思吗?
引用透明度的核心是评估表达式。 从根本上说,它说如果你在一个上下文中计算一个表达式,如果你在任何相同的上下文中计算它,它就会计算到相同的值。
除了"返回"语句根本不计算任何内容。 它们会导致封闭方法的当前调用计算为某物。 没有办法符合引用透明度的概念。 "抛出"语句也有类似的问题。
对于示例,第一个
def foo(n:Int): Int = return n + 1
是良性的,但冗长且非惯用。 第二个
def foo(ns: List[Int]): Any = ns.map(n => return n + 1)
问题要大得多。 如果传递了空列表,则返回空列表。 如果传递了一个非空列表,则返回列表头的值加 1。