Ruby 此代码与send:[]如何工作?
下面的代码生成9的输出。我理解Ruby 此代码与send:[]如何工作?,ruby,methods,Ruby,Methods,下面的代码生成9的输出。我理解send只是调用方法:[],但我不知道参数是如何工作的 x = [1,2,3] x.send :[]=,0,4 #why is x now [4,2,3] x[0] + x.[](1) + x.send(:[],2) # 4 + 2 + 3 第2行和第3行是如何工作的?第2行是 x.send :[]=,0,4 这基本上是一种奇特的写作方式: x[0] = 4 (调用send
send
只是调用方法:[]
,但我不知道参数是如何工作的
x = [1,2,3]
x.send :[]=,0,4 #why is x now [4,2,3]
x[0] + x.[](1) + x.send(:[],2) # 4 + 2 + 3
第2行和第3行是如何工作的?第2行是
x.send :[]=,0,4
这基本上是一种奇特的写作方式:
x[0] = 4
(调用send
允许您调用私有方法,这是两种语法之间的一个区别。此外,可以想象,对象可以覆盖send
方法,这将破坏第一种语法。)
因此,第2行的作用是将4写入数组中的第一个点
现在在第3行,我们看到我们在加三件事。下面是我们要添加的内容列表:
-第一个元素x[0]
-另一种用于访问元素的语法,它访问第二个元素。此语法是一种传统的方法调用,其中方法的名称恰好是x.[](1)
[]
-这显示了Ruby的另一个特性,即x.send(:[],2)
方法。它访问第三个元素send
x[0]=4
,读取数组的首选语法是x[0]
,因为许多不同语言的程序员都熟悉这种语法。然而,从数组中读写实际上是在后台使用方法调用实现的,这就是为什么可以使用一些看起来更像传统方法调用的其他语法
传统的方法调用如下所示:object.foo(arg1、arg2、arg3等)
上面显示的send
功能是Ruby的一个有用特性,它允许您使用符号指定调用的方法,而不是强制您键入确切的名称。它还允许您调用私有方法。提供了另一种调用方法的方法
x.send :[]=,0,4
就是说,在x
上调用[]=
方法,并传递参数0
,4
,相当于:
x[0] = 4
之所以称为“发送”,是因为在Ruby中,方法是通过向对象发送消息来调用的。该消息包含该方法的名称以及该方法可能需要的参数。这个想法来自SmallTalk
x.send(:[]=, 0, 4)
和……一样吗
x.[]=(0, 4)
哪一个有语法上的糖分
x[0] = 4
这应该是其他语言所熟悉的。
当然,括号是可选的
.send
或.public\u send
变体的优点是调用的方法不必硬编码,它可以来自变量
所有这些都与ruby面向对象的范例一致:对象通过发送消息相互通信,消息触发代码执行
*几乎,
#send
也会调用私有方法“x.send(:[]=,0,4)
是一种别致的写作方式,x[0]=4
”,或者“x[0]=4
是一种方便的写作方式,x.send(:[]=,0,4)
”?“…这基本上是一种别致的写作方式:…”——我想说是另一种方式。