在Ruby中,我试图了解to_enum
和enum_for
方法之间的关系。在提出问题之前,我提供了一些示例代码和两个示例来帮助使用上下文。
# replicates group_by method on Array class
class Array
def group_by2(&input_block)
return self.enum_for(:group_by2) unless block_given?
hash = Hash.new {|h, k| h[k] = [] }
self.each { |e| hash[ input_block.call(e) ] << e }
hash
end
end
irb (main)> puts [1,2,3].group_by2.inspect
=> #<Enumerator: [1, 2, 3]:group_by2>
在示例1中:group_by
在[1,2,3]
不传递任何块的情况下,调用数组将返回使用command生成的枚举数self.enum_for(:group_by_2)
。
irb (main)> puts [1,2,3].to_enum.inspect
=> #<Enumerator: [1, 2, 3]:each>
在示例2中,枚举数是通过to_enum
在数组上调用方法生成的[1,2,3]
枚举器在示例1和2中生成的行为是否有所不同?从检查的输出中可以看到它们显示的标签略有不同,但是我发现枚举器的行为有任何不同。
# Output for example #1
#<Enumerator: [1, 2, 3]:each> # label reads ":each"
# Output for example #2
#<Enumerator: [1, 2, 3]:group_by2> # label reads ":group_by2"
p [1, 2, 3].to_enum
p [1, 2, 3].enum_for
--output:--
#<Enumerator: [1, 2, 3]:each>
#<Enumerator: [1, 2, 3]:each>
从文档中:
to_enum
创建一个新的枚举器,该枚举器将通过调用obj上的方法进行枚举,并传递args(如果有)。
...
枚举
创建一个新的枚举器,该枚举器将通过调用obj上的方法进行枚举,并传递args(如果有)。
红宝石是一种语言,通常具有作为同义词的方法名称。
后续问题:
除了在输出中将:each替换为:foo以外,命令[1,2,3] .to_enum(:foo)中的符号是否有其他用途?
是的。默认情况下,ruby将枚举器连接到接收者的each()方法。一些类没有each()方法,例如String:
str = "hello\world"
e = str.to_enum
puts e.next
--output:--
1.rb:3:in `next': undefined method `each' for "helloworld":String (NoMethodError)
from 1.rb:3:in `<main>
to_enum()允许您指定枚举器要使用的方法:
str = "hello\nworld"
e = str.to_enum(:each_line)
puts e.next
--output:--
hello
现在,假设您有array [1, 2, 3]
,并且想要为该数组创建一个枚举数。数组有一个each()方法,但是没有使用each()创建一个枚举数,该枚举数将返回数组中的每个元素,然后结束;您想创建一个枚举数,该枚举数在数组到达末尾时从数组的开头重新开始吗?
e = [1, 2, 3].to_enum(:cycle)
10.times do
puts e.next()
end
--output:--
1
2
3
1
2
3
1
2
3
1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句