目前,我正在通过Odersky的Programming Scala(第二名)来学习Scala。我到了第10章,他开始介绍无参数和空变量方法。我只是无法理解。
到目前为止,我所了解的是,如果一种方法具有副作用,则应该使用空括号,否则应使用无参数方法。
我不知道此约定的优点是什么。我在Stack Exchange上阅读了这些帖子,但是老实说,当这些帖子开始深入讨论该主题时,我迷失了。
我正在寻找有关此语言功能的典型用例以及可以帮助我更好地理解它的优点的简单解释。
目前,我正在通过Odersky的Programming Scala(第二名)来学习Scala。我到了第10章,他开始介绍无参数和空变量方法。我只是无法理解。
到目前为止,我所了解的是,如果一种方法具有副作用,则应该使用空括号,否则应使用无参数方法。
我不知道此约定的优点是什么。我在Stack Exchange上阅读了这些帖子,但是老实说,当这些帖子开始深入讨论该主题时,我迷失了。
我正在寻找有关此语言功能的典型用例以及可以帮助我更好地理解它的优点的简单解释。
Answers:
我以您的问题为由,为什么不首先设计一种语言来防止需要使用约定?换句话说,Scala为什么不总是一直强制使用括号,而不是允许程序员有时省略括号?
答案是在参照透明中找到的。本质上,如果函数没有副作用,则可以用其结果替换函数调用,而无需更改程序的行为。
这意味着没有参数或副作用的函数在语义上等效于val
保留该函数的返回值。由于此属性,随着类的发展,程序员可能会val
出于方便或效率的考虑在使用a 或使用函数之间来回切换。
由于您可以省略括号,这意味着调用类似之类的代码queue.size
不需要知道也不关心size
函数是还是val
。Queue
因此,该类的实现者可以在两者之间自由更改,而无需更改任何调用代码(尽管我相信它将需要重新编译)。它稳定了该类的公共接口。例如,您可以queue.size
通过调用size
底层List
(可能为)开始O(n)
,然后出于效率原因将其更改size
为val
。
当存在副作用时,该约定会建议使用括号,以明确表明该类成员绝对是函数调用,因此可能不是参照透明的。调用代码要知道是否会产生副作用,这一点很重要,这样他们就可以避免重复调用它。如果您不关心它是否是一个函数,则最好将其视为不是。
那是约定,不是语言设计的一部分。它用作路标,以帮助必须在编写代码后阅读代码的人们更好地理解代码。
Scala允许省略arity-0方法上的括号(无参数):
reply() // is the same as reply
但是,仅当所讨论的方法没有副作用(纯功能)时,才应使用此语法。换句话说,在调用时省略括号是可以接受的
queue.size
,但在调用时则不能println()
。认真遵守此约定将极大地提高代码的可读性,并使一目了然地了解任何给定方法的最基本操作。抵制省略括号以节省两个字符的冲动!
在.NET中,惯例是在代码可能需要一段时间才能运行(例如,超过50毫秒)时使用方法,而在代码不运行时(即,简单查找)则使用属性(实质上是空方法)。