【问题标题】:Scala methods with no arguments没有参数的 Scala 方法
【发布时间】:2011-10-19 20:58:59
【问题描述】:

在 Scala 中,有两种方法可以定义不带参数的方法

    1 def a=println("hello")

    2 def a()=println("hello")

这两个方法完全相同,但 (2) 可以带括号和不带括号调用。

在 Scala 中允许使用此功能是否有任何特殊原因。它让我感到困惑何时使用哪个?

【问题讨论】:

  • 不要让你更困惑,但试试def a()()=println("hello")....
  • 这些是方法,不是函数。

标签: scala methods parentheses


【解决方案1】:

允许使用不带括号的语法,因此可以这样写:

abstract class X {
  def f: Int
}

class Y extends X {
  val f = 0
}

X 上调用f 的代码不需要知道它是val 还是def

在调用具有空列表的方法时可以省略括号的原因是允许调用理想情况下没有括号的 Java 方法(但是,因为它们是 Java,所以它们都有括号)。

正如其他人所说,当方法有副作用时使用空参数列表,否则不使用。

【讨论】:

  • 您能否详细说明为什么您将问题中的defs 描述为方法而不是函数? defs 如果传递给高阶函数,就不能变成函数吗?或分配给函数类型Unit => Unit?
  • @Toby 函数和方法是不同的东西,这里我说的是方法。
【解决方案2】:

您是否选择使用括号来表示有副作用的方法调用是一种风格问题。

顺便说一句,如果您使用= 声明一个纯粹的副作用方法,您可能应该显式声明一个Unit 返回类型,如下所示:

def a: Unit = println("hello")

请注意,任何类型都可以强制转换为Unit

如果您不想显式声明返回类型,您可能应该省略=。然后编译器会推断出Unit的返回类型,即使最后一个表达式返回了不同的东西:

def a() { println("hello") }

上述两种风格都使重构更安全,因为修改方法体永远不会导致编译器推断出不同的返回类型。 IMO 这种明确的声明比调用站点代码风格更重要。

【讨论】:

    【解决方案3】:

    一般规则是,只要方法(不是函数)有副作用,您就应该在声明站点和调用站点添加一个空参数列表。

    否则,Scala 具有统一访问原则,因此客户端不需要知道他们是在访问字段还是调用无副作用的方法。

    【讨论】:

    • 副作用函数是那些不返回任何内容并执行一些 I/O 或更改状态的函数。我对吗?执行 I/O、更改状态并仍然返回某些内容的函数呢?
    • 是否返回无关紧要。
    • 约定的目的是空参数列表警告用户调用该方法会产生一些副作用,而不管返回值如何。
    • @codecool,副作用函数是那些修改内部状态的子程序。如果没有适当的上下文,“副作用”这个词可能会产生误导。有时这种效果是您想要并期望发生的。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多