Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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块、过程和Lambdas“;文章_Ruby_Lambda_Proc - Fatal编程技术网

“来自”的过程;理解Ruby块、过程和Lambdas“;文章

“来自”的过程;理解Ruby块、过程和Lambdas“;文章,ruby,lambda,proc,Ruby,Lambda,Proc,好的,通过这个查看过程、lambda和块 关于本守则的问题: class Array def iterate! self.each_with_index do |n, i| self[i] = yield(n) end end end array = [1, 2, 3, 4] array.iterate! do |n| n ** 2 end puts array.inspect 从概念上讲,我几乎了解所有东西,除了一行: self[i]=收益率(

好的,通过这个查看过程、lambda和块

关于本守则的问题:

class Array
  def iterate!
    self.each_with_index do |n, i|
      self[i] = yield(n)
    end
  end
end


array = [1, 2, 3, 4]

array.iterate! do |n|
  n ** 2
end

puts array.inspect
从概念上讲,我几乎了解所有东西,除了一行:

self[i]=收益率(n)

我得到这行中的self
self.each_和| u索引do | n,I |
表示它是一个类方法,对吗

但是为什么我们需要将
yield(n)
中的参数分配给
self[i]

如果可以,请用超基本的方式解释


(换句话说,请友善一点——这里的大多数人都是这样——只是有点额外的紧张,因为我不明白这一点,这让我觉得自己很愚蠢)

方法是
迭代,这是一个实例方法
self
self中。每个带有索引的\u
都是方法的接收者。由于
self
Array
[1,2,3,4]
在您的示例中)的当前实例,因此不需要
self.
;i、 例如,你可以(我也应该)用索引do,i,…
编写
。换句话说,
self
是未指定显式接收器时的隐含接收器

关于线路:

self[i] = yield(n)
对于您的示例
array=[1,2,3,4]
您的枚举数是:

enum = [1,2,3,4].each_with_index
  #=> #<Enumerator: [1, 2, 3, 4]:each_with_index>
因此,
数组传递到块中的第一个元素#每个
都是
[1,0]
,分配给块变量:

n = 1
i = 0
导致

self[0] = yield(1) => 1**2 => 1

等等。

我将尝试用一种超基本的方式来解释

我在这行中得到了这个self
self。每一个带有索引do | n的self,I |
表示 这是一个类方法,对吗

没有。
self
的含义取决于上下文。如果
self
在类中,它将引用该类。但是这里的
self
在一个实例方法中,所以它指的是该实例(所以
每个带有_索引的
也是一个实例方法)

但是为什么我们需要将
yield(n)
中的参数分配给
self[i]

迭代的目标用于就地修改阵列。由于
self
引用实例,
self[i]
访问
迭代的数组元素,因此在适当的位置修改数组

另外,我不知道你说的“参数”是什么意思
yield(n)
n
传递给块,运行块并返回值。

self[i]=yield(n)
将数组中的值重新分配给中指定的块

array.iterate! do |n|
  n ** 2
end
这基本上意味着,取数组的值,并将其平方,将该值保存在数组的元素中。因此,
[1,2,3,4]
变成了
[1**2,2**2,3**2,4**2]=>[2,4,9,16]
自身随着(实际上是)当前上下文或周围对象而变化

monkey正在修补数组类,并且位于实例方法
iterate,self指的是实例本身:在本例中,数组
[1,2,3,4]

你可能会这样想:

class some_class

  def self.a_class_method
  ...
它是在类的上下文中定义的。因此self是类本身(也是一个对象),而不是该类的实例

因为self只是数组
[1,2,3,4]

self[i] = yield(n)

正在用发送块的结果替换数组的每个元素。

在这里迭代!是Array类的实例函数,您有一个Array对象

array.iterate! do |n|
n ** 2
end
您正在通过一个“do | n | n**2 end”块进行迭代!函数。在函数中,您可以使用yield访问此块。但正如您所看到的,块需要一个参数通过| n |,因此您需要传递一个参数,块代码将返回它的平方

self[i] = yield(n)
self正在数组实例上下文中使用。因此它正在修改数组的值

有关更多信息,请查看本文:

array.iterate! do |n|
n ** 2
end
self[i] = yield(n)