【问题标题】:Why to use empty parentheses in Scala if we can just use no parentheses to define a function which does not need any arguments?如果我们可以不使用括号来定义不需要任何参数的函数,为什么要在 Scala 中使用空括号?
【发布时间】:2011-04-22 03:12:48
【问题描述】:

据我了解,在 Scala 中,我们可以通过在名称后使用空括号或根本不使用括号来定义不带参数的函数,这两个定义不是同义词。区分这两种语法的目的是什么?什么时候应该更好地使用一种而不是另一种?

【问题讨论】:

    标签: scala function syntax


    【解决方案1】:

    这主要是一个惯例问题。按照惯例,具有空参数列表的方法会评估其副作用。假设没有参数的方法没有副作用。这就是约定。

    【讨论】:

    • 那么,对于工厂方法,你会怎么做?你会写def createAccount: Account 还是def createAccount(): Account
    • 对于完全惯用的 Scala,工厂方法通常写在伴生对象上,并命名为“apply”。然后,您可以使用 apply 的特殊语法创建对象:Account(args)。
    • 编译器接受覆盖定义而不考虑空参数列表:pastie.org/1204728。在语言规范中查找字符串“空参数列表”。
    • mkneissel 是正确的 - 您可以在 method()method 之间覆盖两种方式。您只能用另一个 val 覆盖 val,但是,method()() 被认为与 method()method 不同(出于覆盖目的,但不用于名称冲突)。
    【解决方案2】:

    Scala 风格指南说只有在被调用的方法没有副作用时才省略括号: http://docs.scala-lang.org/style/method-invocation.html

    【讨论】:

      【解决方案3】:

      其他答案很好,但我也认为值得一提的是,无参数方法可以很好地访问类字段,如下所示:

      person.name
      

      由于使用无参数方法,您可以轻松编写一个方法来拦截对“名称”字段的读取(或写入),而不会破坏调用代码,就像这样

      def name = { log("Accessing name!"); _name }
      

      这叫做Uniform Access Principal

      【讨论】:

      • 我的例子是获取,这里设置 def name_=(name : String) = { _name = name }
      • 是的,我用这个。但我想知道,这是否意味着“name_ =”或“name_=”?
      【解决方案4】:

      我对约定的有用性提出了另一个观点,该约定鼓励在函数声明中使用空括号块(因此稍后在调用它们时)会产生副作用。

      调试器

      如果在调试器中添加一个监视,例如 process 指代焦点调试上下文中的布尔值的示例,或者作为变量视图,或者作为纯无副作用的函数评估,它为您以后的故障排除带来了严重的风险。 确实,如果调试器在您更改上下文(更改线程、在调用堆栈中移动、到达另一个断点...)时将该手表作为尝试评估的东西,我发现 IntelliJ 至少是这种情况IDEA 或其他语言的 Visual Studio,那么可能在任何浏览范围内找到的任何其他 process 函数的副作用都将被触发......

      想象一下,如果您没有想到这个警告,可能会导致这种令人费解的故障排​​除,因为一些无辜的常规命名。如果按照我的示例强制执行约定,则process 布尔评估将永远不会退回到调试器监视中的process() 函数调用;它可能只允许在您的调试器中显式访问将 process() 放入手表的 () 函数,但很明显您没有直接访问任何属性或局部变量,而是回退到其他 process() 函数浏览过的范围,如果可能不走运,至少不会那么令人惊讶。

      【讨论】:

        猜你喜欢
        • 2017-11-07
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 2019-10-21
        相关资源
        最近更新 更多