Ruby 元素引用和赋值方法
Ruby methods for element reference and assignment
我正在阅读 Ruby 2.5.0 的文档,但我不理解有关方法的这一部分:
Additionally, methods for element reference and assignment may be
defined: [] and []= respectively. Both can take one or more arguments,
and element reference can take none.
class C
def [](a, b)
puts a + b
end
def []=(a, b, c)
puts a * b + c
end
end
obj = C.new
obj[2, 3] # prints "5"
obj[2, 3] = 4 # prints "10"
1)本例中的赋值方法为什么以及如何赋值a=2 b=3和c=4?
2) 好像和元素引用的方法一样,如果是这样,为什么会存在呢?我可以写:
def [](a, b, c)
puts a * b + c
end
obj[2, 3, 4] # prints "10"
它不会改变任何东西,对吗?
1) Why and how the assignment method in this case assigns a=2 b=3 and c=4?
a
、b
和c
是参数和2
、3
和4
是参数。参数与其他方法一样绑定到参数,因为 []=
是 方法,就像其他方法一样。
2) Seems that it behaves like the method for element reference, so if this is the case, why does it exist? I could just write: […]
您也可以只写 obj.foo(2, 3, 4)
或 obj.frobnicate(2, 3, 4)
或 obj.(2, 3, 4)
。没关系。它只是一个方法,与其他方法一样,[]=
只是一个名称。你也可以这样写
obj.[]=(2, 3, 4)
如果你愿意。
名字并不重要。 (无论如何,对于计算机。)
除了名字 重要! (方法)名称是我们用来向我们的(人类)同事传达代码意图的名称。
因此,[]
和 []=
是不同的名称,它们传达不同的意图。特别是,[]
将意图传达给 get 某物,而 []=
将意图传达给 set 某物。但是请注意,文档中的示例纯粹演示了如何为索引器和索引分配方法绑定参数,它们不是如何使用此类方法的好例子;也许这是你困惑的一部分。一个更好的例子是 []
和 []=
方法如何被 Array
和 Hash
类.
使用
另请注意,"the name doesn't matter" 有点夸张。名字 很重要,因为 Ruby 允许你写
obj[2, 3] = 4
而不是
obj.[]=(2, 3, 4)
这将是发送到名为 []=
的方法的消息的 "normal" 语法。 []=
是一组具有 语法糖 的方法之一,允许以非标准方式调用它们。其他此类方法是 +
、-
、*
、/
、%
、<<
、>>
、|
, &
等可以像 a + b
那样调用而不是 a.+(b)
, !
, +@
, -@
, 可以这样调用!a
、+a
和 -a
而不是 a.!
、a.+@
和 a.-@
、call
,它们可以像 a.(1, 2)
而不是 a.call(1, 2)
,任何以 =
结尾的方法都可以像 a.foo = 42
那样调用而不是 a.foo=(42)
。 (还有其他一些。)
我正在阅读 Ruby 2.5.0 的文档,但我不理解有关方法的这一部分:
Additionally, methods for element reference and assignment may be defined: [] and []= respectively. Both can take one or more arguments, and element reference can take none.
class C
def [](a, b)
puts a + b
end
def []=(a, b, c)
puts a * b + c
end
end
obj = C.new
obj[2, 3] # prints "5"
obj[2, 3] = 4 # prints "10"
1)本例中的赋值方法为什么以及如何赋值a=2 b=3和c=4?
2) 好像和元素引用的方法一样,如果是这样,为什么会存在呢?我可以写:
def [](a, b, c)
puts a * b + c
end
obj[2, 3, 4] # prints "10"
它不会改变任何东西,对吗?
1) Why and how the assignment method in this case assigns a=2 b=3 and c=4?
a
、b
和c
是参数和2
、3
和4
是参数。参数与其他方法一样绑定到参数,因为 []=
是 方法,就像其他方法一样。
2) Seems that it behaves like the method for element reference, so if this is the case, why does it exist? I could just write: […]
您也可以只写 obj.foo(2, 3, 4)
或 obj.frobnicate(2, 3, 4)
或 obj.(2, 3, 4)
。没关系。它只是一个方法,与其他方法一样,[]=
只是一个名称。你也可以这样写
obj.[]=(2, 3, 4)
如果你愿意。
名字并不重要。 (无论如何,对于计算机。)
除了名字 重要! (方法)名称是我们用来向我们的(人类)同事传达代码意图的名称。
因此,[]
和 []=
是不同的名称,它们传达不同的意图。特别是,[]
将意图传达给 get 某物,而 []=
将意图传达给 set 某物。但是请注意,文档中的示例纯粹演示了如何为索引器和索引分配方法绑定参数,它们不是如何使用此类方法的好例子;也许这是你困惑的一部分。一个更好的例子是 []
和 []=
方法如何被 Array
和 Hash
类.
另请注意,"the name doesn't matter" 有点夸张。名字 很重要,因为 Ruby 允许你写
obj[2, 3] = 4
而不是
obj.[]=(2, 3, 4)
这将是发送到名为 []=
的方法的消息的 "normal" 语法。 []=
是一组具有 语法糖 的方法之一,允许以非标准方式调用它们。其他此类方法是 +
、-
、*
、/
、%
、<<
、>>
、|
, &
等可以像 a + b
那样调用而不是 a.+(b)
, !
, +@
, -@
, 可以这样调用!a
、+a
和 -a
而不是 a.!
、a.+@
和 a.-@
、call
,它们可以像 a.(1, 2)
而不是 a.call(1, 2)
,任何以 =
结尾的方法都可以像 a.foo = 42
那样调用而不是 a.foo=(42)
。 (还有其他一些。)