如何在 Ruby 中实现枚举器?

发布于 2024-12-08 20:52:01 字数 308 浏览 3 评论 0原文

例如:

a = [1,2,3,4,5]
a.delete_if { |x| x > 3 }

相当于:

a = [1,2,3,4,5]
a.delete_if.each.each.each.each { |x| x > 3 }

我知道 a.delete_if 返回一个枚举器。但是,当 each 块返回 true 时,它​​如何知道应该删除对象呢?如何手动(在 Ruby 中)实现 delete_if

For example:

a = [1,2,3,4,5]
a.delete_if { |x| x > 3 }

is equivalent to:

a = [1,2,3,4,5]
a.delete_if.each.each.each.each { |x| x > 3 }

I know a.delete_if returns an enumerator. But how does it know it should delete object when the each block returns true? How to implement delete_if by hand(and in Ruby)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无尽的现实 2024-12-15 20:52:01

你可以看一下Rubinius源代码:可枚举模块

这是拒绝方法的示例:

  def reject
    return to_enum(:reject) unless block_given?

    ary = []
    each do |o|
      ary << o unless yield(o)
    end

    ary
  end

You can take a look at the Rubinius source code: enumerable module

Here an example of the reject method:

  def reject
    return to_enum(:reject) unless block_given?

    ary = []
    each do |o|
      ary << o unless yield(o)
    end

    ary
  end
完美的未来在梦里 2024-12-15 20:52:01

在delete_if的实现中,代码可以验证从yield返回的值来决定是否从数组中删除给定的条目。

您可以阅读《Ruby 编程》指南中的实现迭代器了解更多详细信息,但它看起来像这样:

class Array
  def delete_if
     reject { |i| yield i }.to_a
  end
end

上面使用 yield 将数组中的每个项目传递到与调用 delete_if 关联的块,并隐式返回yield 到外部 reject 调用。

In the implementation of delete_if, the code can verify the value returned from yield to decide whether or not to delete the given entry from the array.

You can read Implementing Iterators in the Programming Ruby guide for more details, but it would looks something like:

class Array
  def delete_if
     reject { |i| yield i }.to_a
  end
end

The above uses yield to pass each item in the array to the block associated with the call to delete_if, and implicitly returns the value of the yield to the outer reject call.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文