2013-10-07 58 views
0

方法的返回值我有这个类:迭代器(array.each),如红宝石

class MyArray 
    attr_accessor :data 

    def initialize(my_object = nil) 
    @data = Array[*my_object] 
    end 

    def <<(y) 
    @data << y 
    end 

    def each 
    @data.each 
    end 
end 

,我使用它像这样

subject = MyArray.new([2, 5, 3]) 
    d = [] 
    subject.each { |i| 
    d << i 
    } 

的问题是,它不会通过-subject.each-遍历一次。我应该怎么做才能返回数组中的“每个”值作为方法的返回值?如何返回迭代器本身?

我尝试这样做,它不是工作压力太大:

def each 
    [2,5,3].each 
    end 

感谢 “meagar” 和 “埃里克Allik” 我们有正确的答案:(只有“DEF各“方法已经改变)

class MyArray 
    attr_accessor :data 

    def initialize(my_object = nil) 
    @data = Array[*my_object] 
    end 

    def <<(y) 
    @data << y 
    end 

    def each(&block) 
    @data.each(&block) 
    end 
end 
+0

您应该编辑您的问题,包括你的'initialize'方法。你可能认为应该很明显你有一个正确的构造函数,但是在SO中存在很多类似的问题,其中海报的问题在于屏外代码(或者在没有代码的情况下),特别是当海报是Ruby新手时。 –

+0

好点,我编辑它 – libik

+0

请注意,你可以用'def initialize(my_object = nil)@data = Array [* my_object] end'替换你的构造函数。这样,'my_object'可以是除set(array,hash,range),字符串,proc或不可变对象(integer,float,true,false,nil)之外的任何集合。其他?眼镜为强大的图示! –

回答

4

的问题是,each {block}被实际调用each在阵列上并且传递给该方法的参数块。你的块参数被忽略。

如果你想要这个工作,你需要将块转发到您的嵌套调用each

class Test 
    def each(&block) 
    [1, 2, 3].each(&block) 
    end 
end 

Test.new.each do |i| 
    puts i 
end 

如果你想返回一个迭代器,你可以这样做,但你必须调用each上迭代,并给它块:

class Test 
    def each 
    [1, 2, 3].each 
    end 
end 

Test.new.each.each do |i| 
    puts i 
end 
+0

Tx!这是工作! – libik

1

你需要通过传递给您的自定义块到实际underlyign each

def each(&block) # take the block passed to each as a Proc object 
    @data.each(&block) # pass the Proc on as a block to the underlying each 
end 

这相当于:

def each 
    # just create a new block that calls the passed in block 
    # without creating an intermediate Proc object 
    @data.each { |i| yield i } 
end 
+0

也谢谢你,这个答案几乎和以前一样,你是对的:)。 – libik