Tag: 枚举

为什么Enumerable#find /#detect即使在Hash上调用也会返回一个数组?

Enumerable#find / #detect的文档说: find(ifnone = nil) { |obj| block } → obj or nil find(ifnone = nil) → an_enumerator 将枚举中的每个条目传递给块 。 返回第一个块不为false的块。 如果没有对象匹配,则调用ifnone并在指定时返回其结果,否则返回nil 。 但是,当在Hash上调用它时,结果将类型更改为Array而不是原始Hash。 是关于此数据类型的一些实现错误还是一些历史约定? {a: ‘a’, b:’b’}.find {|k, v| v == ‘b’} # => [:b, ‘b’]

Ruby的Enumerator对象如何在内部迭代器上进行外部迭代?

根据Ruby的文档,如果没有为to_enum或enum_for方法提供目标方法,则Enumerator对象使用each方法(枚举)。 现在,我们以下面的猴子补丁及其枚举器为例 o = Object.new def o.each yield 1 yield 2 yield 3 end e = o.to_enum loop do puts e.next end 鉴于Enumerator对象在调用next时使用each方法来回答,每次调用next时,如何调用each方法? Enumeartor类是否预先加载o.each的所有内容并为枚举创建本地副本? 或者是否有某种Ruby魔术在每个yield语句中挂起操作,直到在enumeartor上调用next? 如果制作了内部副本,它是否是深层副本? 那些可以用于外部枚举的I / O对象呢? 我正在使用Ruby 1.9.2。

如何在Ruby中使用C#样式枚举?

我只想知道在Ruby中模拟C#样式枚举的最佳方法。

计算数组中的不同元素

我有一个数组: a = [1, 2, 3, 3, 6, 8, 1, 9] 我想显示每个唯一元素值及其相关元素计数如下: 1: 2 2: 1 3: 2 6: 1 8: 1 9: 1 到目前为止我有: a.sort.group_by { |x| x } { 1 => [ [0] 1, [1] 1 ], 2 => [ [0] 2 ], 3 => [ [0] 3, [1] 3 ], 6 => […]

当你的类没有定义#each时,返回Enumerator :: Lazy的最佳方法是什么?

可枚举#each依赖于你的枚举提供#each方法。 如果您的枚举没有#each方法,则无法使用#lazy 。 现在, Kernel#enum_for和#to_enum可以灵活地指定除#each之外的枚举方法: Kernel#enum_for(method = :each, *args) 但#enum_for和朋友总是构造普通(非懒惰)枚举器,而不是Enumerator::Lazy 。 我看到Ruby 1.9.3中的Enumerator提供了类似的#newforms: Enumerator#new(obj, method = :each, *args) 不幸的是,在Ruby 2.0中已经完全删除了构造函数。 此外,我认为它在Enumerator::Lazy上根本不可用。 所以在我看来,如果我有一个带有方法的类,我想返回一个惰性枚举器,如果该类没有#each那么我必须定义一些定义#each辅助类。 例如,我有一个Calendar类。 从一开始就提出列举每一个日期对我来说真的没有意义。 #each会没用。 相反,我提供了一个从开始日期(懒惰)枚举的方法: class Calendar … def each_from(first) if block_given? loop do yield first if include?(first) first += step end else EachFrom.new(self, first).lazy end end end 并且EachFrom类看起来像这样: class EachFrom include Enumerable def […]

Ruby数组的哈希。 group_by并在一行中修改

我有一系列哈希,类似于 [ {:type=>”Meat”, :name=>”one”}, {:type=>”Meat”, :name=>”two”}, {:type=>”Fruit”, :name=>”four”} ] 我想把它转换成这个 { “Meat” => [“one”, “two”], “Fruit” => [“Four”]} 我试过group_by然后我得到了这个 { “Meat” => [{:type=>”Meat”, :name=>”one”}, {:type=>”Meat”, :name=>”two”}], “Fruit” => [{:type=>”Fruit”, :name=>”four”}] } 然后我不能修改它只留下名称而不是完整的哈希。 我需要在一行中执行此操作,因为对于Rails表单上的grouped_options_for_select 。