迭代器(array.each)作为ruby中方法的返回值

lib*_*bik 1 ruby

我有这门课:

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
Run Code Online (Sandbox Code Playgroud)

我是这样使用它的

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

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

我试过这个,但它也不起作用:

  def each
    [2,5,3].each
  end
Run Code Online (Sandbox Code Playgroud)

感谢“meagar”和“Erik Allik”,我们有了正确的答案:(只有“def each”方法发生了变化)

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
Run Code Online (Sandbox Code Playgroud)

mea*_*gar 5

问题是each {block}实际上是在调用each数组并将参数传递给方法。您的块参数被忽略。

如果你想让它工作,你需要将块转发到你的嵌套each调用中:

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

Test.new.each do |i|
  puts i
end
Run Code Online (Sandbox Code Playgroud)

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

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

Test.new.each.each do |i|
   puts i
end
Run Code Online (Sandbox Code Playgroud)