ruby - 在 Ruby 中将迭代器转换为数组的单行器

标签 ruby

这必须是一个常见问题解答,但经过大量网络搜索,我未能找到答案。我是 Ruby 编程语言的新手,所以我可能误解了一些基本的东西,或者我正在将我的 C#、F# 或 Haskell 知识转换到 Ruby 上。
如果我有类似以下的方法,是否有单行程序可以将其转换为数组或其他可变数据结构?

def foo
  yield 8
  yield 2
  yield 5
end
我知道我可以这样做:
ary = Array.new
foo { |x| ary << x }
然而,这不是单行的。例如,在 C# 中,我可以使用 ToListToArray扩展方法,或在 F# 中,例如Seq.toList :
let foo = seq {
    yield 8
    yield 2
    yield 5
}

let arr = foo |> Seq.toList
Ruby 中是否有类似的单行代码?
还是我完全误解了 foo 的性质? ?

最佳答案

实际上,您的问题中有两个独立的问题。
第一个问题在标题中:

One-liner to convert an iterator to an array in Ruby


这很简单: Enumerator ,这是在 Ruby 中调用的迭代器,混合在(继承自) Enumerable . Enumerable Enumerable#to_a 创建 Array 的方法来自 Enumerable ,因此也来自 Enumerator , 因为 Enumerator IS-AN Enumerable .
所以,如果你有 Enumerator ,您只需调用to_a ,例如
some_enum.to_a
但是,您没有 Enumerator .你有一个方法。所以,你没有问的真正问题是问题的关键,是:我如何创建 Enumerator从一个方法?
这就是 Object#enum_for 做:
enum = enum_for(:foo)
#=> #<Enumerator: ...>

ary = enum.to_a
#=> [8, 2, 5]
但是请注意,在许多情况下,您实际上并不需要 Array , 自 Enumerator继承自 Enumerable就像 Array确实如此,因此会响应许多相同的消息。
另请注意,按照惯例,Ruby 中有许多“迭代器”方法,例如 Enumerable#map , #each等,将返回 Enumerator当它们在没有 block 的情况下被调用时:
def foo
  return enum_for(__callee__) { 3 } unless block_given?

  yield 8
  yield 2
  yield 5
end
然后你可以简单地做:
enum = foo
#=> #<Enumerator: ...>

ary = enum.to_a
#=> [8, 2, 5]

关于ruby - 在 Ruby 中将迭代器转换为数组的单行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66059586/

相关文章:

ruby-on-rails - Rails Redis 设置 maxmemory 和 maxmemory-policy

ruby-on-rails - BCrypt 身份验证总是失败 RAILS

ruby - 如何根据第一个或最后一个嵌入文档中的字段值提取 Mongoid 文档?

ruby-on-rails - Rails中的意外 session 劫持4.2.4(Devise/Warden),Phusion乘客5.0.24

Ruby:自定义 gem 需要 'require' 用于其中的模块

ruby - 直接修改 Gemfile.lock 会发生什么?

ruby-on-rails - 如何使用 Rails Form 和 Role Model Gem 添加多个角色

ruby-on-rails - Rails Select Drop Down for States?

ruby - 即使默认路由是用模块化风格实现的,Sinatra 也不知道这个小事

javascript - Sprockets::FileNotFound:在 Rails 应用程序中找不到类型为 'jquery' Heroku 的文件 'application/javascript'