Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 此代码与send:[]如何工作?_Ruby_Methods - Fatal编程技术网

Ruby 此代码与send:[]如何工作?

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

下面的代码生成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
方法,这将破坏第一种语法。)

因此,第2行的作用是将4写入数组中的第一个点

现在在第3行,我们看到我们在加三件事。下面是我们要添加的内容列表:

  • x[0]
    -第一个元素
  • x.[](1)
    -另一种用于访问元素的语法,它访问第二个元素。此语法是一种传统的方法调用,其中方法的名称恰好是
    []
  • x.send(:[],2)
    -这显示了Ruby的另一个特性,即
    send
    方法。它访问第三个元素
结果是9,因为第三行添加了数组的第一、第二和第三个元素

这些例子似乎说明了Ruby语言设计中一个有趣的观点。具体来说,数组访问是作为方法调用实现的。写入数组的首选语法是
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)
”?“…这基本上是一种别致的写作方式:…”——我想说是另一种方式。