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?

abc参数234 是参数。参数与其他方法一样绑定到参数,因为 []= 方法,就像其他方法一样。

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 某物。但是请注意,文档中的示例纯粹演示了如何为索引器和索引分配方法绑定参数,它们不是如何使用此类方法的好例子;也许这是你困惑的一部分。一个更好的例子是 [][]= 方法如何被 ArrayHash 类.

使用

另请注意,"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)。 (还有其他一些。)