Ruby中[1,2,3] .to_enum和[1,2,3] .enum_for之间的差异

Popedotninja

在Ruby中,我试图了解to_enumenum_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

范例1:

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)

范例#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"
7stud
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

{1,2,3}与{1..3}之间的差异

如何在Ruby中将“ [1,2,3]”转换为[1,2,3]

在Array(3)与[1,2,3]之间映射常量函数:为什么它们不同

在 sql 中将值从 ('1,2,3') 拆分为 ('1','2','3') 或 (1,2,3)

当组1,2,3或4之间没有实例时,如何匹配(group2。* | ^。*)group1?

如何制作一个在2或3之间选择的随机数生成器。(不是1,2,3)

std :: initializer_list <int>({1,2,3})和{1,2,3}有什么区别?

tf.constant([1,2,3])和tf.constant([[1,2,3]])有什么区别

是“在(1,2,3)中设置a = 2和b”有效的mysql语法

在Javascript中将列表[[1,2,3]`转换为字符串'{1,2,3}'

将1,2,3分为个人1、2和3

为什么 a[1:-1:-1] 和 a=[1,2,3] 返回 []?

为什么`“%,2,%”之类的“,1,2,3,”`返回零?

为什么两种情况下的行为不同1。int i = 1,2,3; 和第二。我 i = 1,2,3;

为什么布尔表达式“(1,2,3)== True中的1”为False?

在Excel公式中“ A1:A4 ^ {1,2,3}”是什么意思?

Haskell:'做[1,2,3]; [“ hello”]'行为说明

Matplotlib:scatter.legend_elements()不是1,2,3

程序排除1,2,3以外的数字

1,2,3 SQL Server每次自动增加列

为什么null不in(1,2,3)为false

在 Python 中将“[1,2,3]”转换为整数

使用WHERE x IN(1,2,3)清理MySQL资源

如何生成多页[X]的框[1,2,3 ...]

Python:(1,2,3)和[1,2,3]有什么区别,什么时候应该使用它们?

生成范围(1,2,3 ... 99; 1,2,3 ... 99;)的唯一数字系列,没有重复

Python 3中max([[a in in [1,2]]])和max(a [in in [1,2]])之间的差异

为什么 a = [1,2,3] 和 a[:] 不一样

為什麼 'val arr: Int => Int = Array(1,2,3)' 在 Scala 中是允許的