“来自”的过程;理解Ruby块、过程和Lambdas“;文章
好的,通过这个查看过程、lambda和块 关于本守则的问题:“来自”的过程;理解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]=收益率(
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)
我得到这行中的selfself.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
等等。我将尝试用一种超基本的方式来解释
我在这行中得到了这个selfself。每一个带有索引do | n的self,I |
表示
这是一个类方法,对吗
没有。self
的含义取决于上下文。如果self
在类中,它将引用该类。但是这里的self
在一个实例方法中,所以它指的是该实例(所以每个带有_索引的
也是一个实例方法)
但是为什么我们需要将yield(n)
中的参数分配给self[i]
迭代的目标代码>用于就地修改阵列。由于self
引用实例,self[i]
访问迭代的数组元素正在调用code>,因此在适当的位置修改数组
另外,我不知道你说的“参数”是什么意思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)