我正在阅读 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
是论据。参数像所有其他方法一样绑定(bind)到参数,因为 []=
是与其他所有方法一样的方法。
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)
如果你愿意的话。
名字并不重要。 (无论如何,对于计算机。)
除了名字确实很重要! (方法)名称是我们用来向我们的(人类)同事传达代码意图的名称。
所以,[]
和 []=
是不同的名称,它们传达不同的意图。特别是,[]
传达意图得到的东西和[]=
传达设置某物的意图。但是请注意,文档中的示例纯粹演示了如何为索引器和索引赋值方法绑定(bind)参数,它们不是如何使用此类方法的好示例;也许这是你困惑的一部分。一个更好的例子是 []
和 []=
Array
使用的方法和 Hash
类。
另请注意,“名称无关紧要”有点夸张。名称确实很重要,因为 Ruby 允许您编写
obj[2, 3] = 4
代替
obj.[]=(2, 3, 4)
这将是消息发送到名为 []=
的方法的“正常”语法. []=
是一组具有语法糖 的方法之一,允许以非标准方式调用它们。其他此类方法是 +
, -
, *
, /
, %
, <<
, >>
, |
, &
等等,可以这样调用 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-on-rails - 用于元素引用和赋值的 Ruby 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603806/