ruby-on-rails - 用于元素引用和赋值的 Ruby 方法

标签 ruby-on-rails ruby methods code-documentation

我正在阅读 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/

相关文章:

Ruby:Proc#call 与 yield

ruby-on-rails - has_many 通过关联 where 和 select 结果

go - Stringer 方法需要值

c++ - 使用循环创建类对象

java - 如何使用 Ruby、PHP 或 Java 解析/提取/提取 ASP.net 网站内容?

javascript - Ajax 在等待 d3 graphs/.json 响应时加载图形? ( rails )

ruby-on-rails - Rails、ActiveResource 和分页

ruby-on-rails - 使用引擎时如何找到模型中的资源路径?

ruby - bundle 安装到开发

Golang (v1.8) - 错误 : type *mux. Route has no field or method Method