我遇到了以下Ruby代码:

class MyClass
    attr_accessor :items
    ...
    def each
        @items.each{|item| yield item}
    end
    ...
end
each方法有什么作用?特别是,我不明白yield是做什么的。

最佳答案

这是充实示例代码的示例:

class MyClass
  attr_accessor :items

  def initialize(ary=[])
    @items = ary
  end

  def each
    @items.each do |item|
      yield item
    end
  end
end

my_class = MyClass.new(%w[a b c d])
my_class.each do |y|
  puts y
end
# >> a
# >> b
# >> c
# >> d
each在集合上循环。在这种情况下,它将遍历@items数组中的每个项目,这些数组是在我执行new(%w[a b c d])语句时初始化/创建的。
yield item方法中的MyClass.eachitem传递给my_class.each附加的块。将产生的item分配给本地y

有帮助吗?

现在,这里有更多关于each的工作方式的信息。使用相同的类定义,下面是一些代码:
my_class = MyClass.new(%w[a b c d])

# This points to the `each` Enumerator/method of the @items array in your instance via
#  the accessor you defined, not the method "each" you've defined.
my_class_iterator = my_class.items.each # => #<Enumerator: ["a", "b", "c", "d"]:each>

# get the next item on the array
my_class_iterator.next # => "a"

# get the next item on the array
my_class_iterator.next # => "b"

# get the next item on the array
my_class_iterator.next # => "c"

# get the next item on the array
my_class_iterator.next # => "d"

# get the next item on the array
my_class_iterator.next # =>
# ~> -:21:in `next': iteration reached an end (StopIteration)
# ~>    from -:21:in `<main>'

请注意,在最后一个next上,迭代器从数组末尾掉落。这是不使用块的潜在陷阱,因为如果您不知道数组中有多少个元素,您可以要求太多项并获得异常。

each与一个块一起使用将遍历@items接收器,并在到达最后一项时停止,避免错误,并保持环境整洁。

关于ruby - Ruby中的 “yield”关键字有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4321737/

10-13 06:43