2014-10-28 41 views
2

好的,通过这个link评论Procs,lambdas和块。来自“了解Ruby块,Procs和Lambdas”的文章文章

问这个代码:

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] = yield(n)

我得到的是这种自我在此行self.each_with_index do |n, i|意味着这是一种类方法,对吧?

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

如果可以,请用超级方式解释。

(换句话说,请好的 - 这人一般都是对大部分在这里 - 只是一点点额外的紧张,我没有得到这其中让我觉得自己很蠢)

回答

0

的方法是iterate!,这是一个实例方法。 self in self.each_with_index是方法Enumerable#each_with_instance的接收器。由于selfArray(在本例中为[1,2,3,4])的当前实例,因此不需要self.;即你可以(和imo,应该)只写each_with_index do |n, 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> 

与元件

enum.to_a 
    #=> [[1, 0], [2, 1], [3, 2], [4, 3]] 

通过Array#each传递到块中的第一个元素,因此是[1,0] ,这是assigne d到块变量:导致

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

n = 1 
i = 0 

0

我会尽量以超级基本的方式解释。

我知道这个自我在这一行self.each_with_index do |n, i|意味着 它是一个类的方法,对吧?

没有。 self的含义取决于上下文。如果self在课堂上,则表示该课程。但是这里的self在实例方法中,所以它指的是实例(因此each_with_index也是一个实例方法)。

但是,为什么我们需要将yield(n)中的参数指定为self[i]

iterate!的目标是修改数组到位。由于self指向实例,因此self[i]将访问正在调用iterate!的数组元素,从而修改该数组。

此外,我不确定您在这里的“参数”是什么意思。 yield(n)n传递给块,运行块并返回值。

0

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]

0

自我更改(实际上是)当前上下文或周围对象。

由于

self.each_with_index do |n, i| 
... 

是猴修补Array类和是一个实例方法iterate!内,自指实例本身:在这种情况下,阵列[1, 2, 3, 4]

你可能在想这样:

class some_class 

    def self.a_class_method 
    ... 

其在类的上下文中定义。所以自我就是这个类本身(它也是一个对象),而不是该类的一个实例。

由于自我只是阵列[1, 2, 3, 4]

self[i] = yield(n) 

与在块中发送的结果替换阵列的每个元素。

0

这里迭代!是Array类的一个实例功能,你有一个数组物体而你做

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

你传递一个块“做| N | n ** 2结束'迭代!函数。在函数中,您可以使用yield来访问此块。但正如您所看到的,块通过| n |期待一个参数所以你需要传递一个参数,块代码将返回它的平方。

self[i] = yield(n) 

self正在数组实例上下文中使用。所以它正在修改数组的值。

欲了解更多信息,请查看这篇文章:

http://geekdirt.com/blog/blocks-lambda-and-procs-in-ruby/