对scala官方文档页面中的几行代码感到困惑
在本文档页面中: 我看到了以下示例代码:对scala官方文档页面中的几行代码感到困惑,scala,Scala,在本文档页面中: 我看到了以下示例代码: class EdgeImpl(origin: Node, dest: Node) { def from = origin def to = dest } 我觉得奇怪的是,“def”通常应该用来定义一个方法,但是为什么在这里“from”和“to”被分配了“Node”对象呢 有人能确认这是文档页面中的错误还是我的理解有误吗?from和to是类EdgeImpl中的方法。它们都有零个参数,返回类型为节点本身未“分配”源代码的值。它只是一个总是返
class EdgeImpl(origin: Node, dest: Node) {
def from = origin
def to = dest
}
我觉得奇怪的是,“def”通常应该用来定义一个方法,但是为什么在这里“from”和“to”被分配了“Node”对象呢
有人能确认这是文档页面中的错误还是我的理解有误吗?
from
和to
是类EdgeImpl
中的方法。它们都有零个参数,返回类型为节点
<源代码>本身未“分配”源代码的值。它只是一个总是返回origin
的方法
如果没有对它进行太多的解读,它可能只是一个
val
,但是一个返回常量值的方法是完全有效的。经过一些调查,我认为它们应该是无参数的方法
无参数函数是不带参数的函数,它
定义时没有任何空括号。无参数调用
函数不能提供括号。这支持统一访问
原理,使def可以在无需更改的情况下更改为val
需要更改客户端代码
无参数方法是作为
类、特征或单一对象
我不认为这是页面上的错误: 考虑以下这一行:
def from = origin
该方法的返回类型是什么?它是节点
-那么,这告诉了你什么?它只是意味着它是类EdgeImpl
中的一个getter方法。这是Scala中编写getter的一个非常常见的约定
您可能会争辩说,发现getter方法被“分配”给某个对象是令人困惑的,它应该明确地说它是一个带有空
()
的getter方法。简单的规则是:在没有副作用发生的情况下,使用无参数方法是非常好的。但是如果不需要param方法(带有()
)的方法),它通常用于可能产生副作用的地方,比如写入文件或保持可变状态等等 scala中的方法定义如下所示
def methodName(param1: ParamType, param2: ParamType): ReturnType = { methodBody; return foo }
现在,请记住,返回类型归属和关键字return
是可选的,大括号(如果整个方法由一条语句组成)和参数列表(如果没有参数)也是可选的,这有帮助吗
有java背景、厌恶新奇事物的人可以编写如下函数
def from(): Node = { return origin; }
这(几乎)相当,但不太地道,更难阅读 它们都是只返回
origin
和dest