ruby中可枚举方法和迭代器方法的区别

ruby中可枚举方法和迭代器方法的区别,ruby,Ruby,我正在学习ruby 我想知道ruby中可枚举方法和迭代器方法之间的区别,以及我们为什么使用枚举器方法 在我看来,两者都一样 我想知道两者的区别 正规迭代器法 3.times do |x| puts x end 使用每个枚举器 enumerator = 3.times enumerator.each do |x| puts x end 也适用于字符串 "scriptkiddie".each_char{|x| puts x} 使用枚举器对象 "scriptkiddie".enum_for(:e

我正在学习ruby

我想知道ruby中可枚举方法和迭代器方法之间的区别,以及我们为什么使用枚举器方法

在我看来,两者都一样

我想知道两者的区别

正规迭代器法

3.times do
|x| puts x
end
使用每个枚举器

enumerator = 3.times
enumerator.each do
|x| puts x
end
也适用于字符串

"scriptkiddie".each_char{|x| puts x}
使用枚举器对象

"scriptkiddie".enum_for(:each_char).each{|x| puts x}
使用枚举器的好处是什么。我应该在哪里使用枚举器

请帮助我理解差异

回答您的原始问题 是的,“迭代器”在未使用块时返回一个值

但是,如果您只是在学习Ruby,并且想要在数组/范围/哈希上迭代,只需知道使用
每个
将涵盖您的大多数情况:

[1, 2, 3].each do |element|
  puts element
end
# 1
# 2
# 3

('a'..'e').each do |element|
  puts element
end
# a
# b
# c
# d
# e

{'a' => 1, 'b' => 2}.each do |key, value|
  puts key
  puts value
end
# a
# 1
# b
# 2
在您的级别上,您不必关心这些方法是在哪里定义的,对于哪个类或模块,或者如何调用它们

最后,不应该在Ruby中使用,因为它们可以显示奇怪的行为

你最新的问题 你把问题说得更清楚了,这很好。请注意,更改可能会被忽略,特别是如果您已经接受了答案

3.5倍 像这样使用,两者完全相同。由于第二个变量更为详细,并且枚举器可能没有在其他任何地方使用,因此没有理由使用第二个变量<代码>枚举数
的长度大于
3。但次数仍为:)

请注意,
| x |
应与块开始位于同一行。我可以帮你

每个字符 同样,如果您所做的只是创建一个枚举数并直接对其调用
每个
,则没有理由使用第二个变量

为什么使用枚举器? 链接方法 使用
枚举器的一个原因是能够链接方法:

puts 3.times.cycle.first(7)
#=> [0, 1, 2, 0, 1, 2, 0]

无限列表 枚举数还可以处理无限列表

require 'prime'

every_prime = Prime.each
p every_prime.first(20)
#=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]

p every_prime.lazy.select{|x| x > 1000}.first(3)
#=> [1009, 1013, 1019]
自定义迭代 可以为自定义迭代定义新的枚举数:

require 'date'

def future_working_days(start_date = Date.today)
  date = start_date
  Enumerator.new do |yielder|
    loop do
      date += 1
      yielder << date unless date.saturday? || date.sunday?
    end
  end
end

puts future_working_days.take(3)
# 2017-02-01
# 2017-02-02
# 2017-02-03
需要“日期”
def未来工作日(开始日期=日期。今天)
日期=开始日期
Enumerator.new do | yielder|
环道
日期+=1

伊埃尔德你到底在说什么方法?你的意思是吗?@tadman请告诉我枚举器和iterator@EricDuminil请告诉我枚举器和迭代器之间的区别。区别是-其中之一存在。从技术上讲,这是一个
枚举器
,其中一个祖先是
可枚举的
@scriptkiddie1 Ruby中没有“迭代器”类。迭代器只是一个概念,枚举器是一个概念的实现。@tadman谢谢你,兄弟,我认为迭代器是一个类,每个类。。迭代器的方法是否“在您的级别”-答案不应该只针对OPs级别,Stackoverflow是所有程序员的参考书,google为这个问题提供了帮助。这个答案并没有解释这两种方法之间的权衡,也没有给出一个使用枚举器的理由的例子。很好的答案。超越一切!
puts 3.times.cycle.first(7)
#=> [0, 1, 2, 0, 1, 2, 0]
"script".each_char.with_index{|c, i|
  puts "letter #{i} : #{c}"
}
# letter 0 : s
# letter 1 : c
# letter 2 : r
# letter 3 : i
# letter 4 : p
# letter 5 : t
require 'prime'

every_prime = Prime.each
p every_prime.first(20)
#=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]

p every_prime.lazy.select{|x| x > 1000}.first(3)
#=> [1009, 1013, 1019]
require 'date'

def future_working_days(start_date = Date.today)
  date = start_date
  Enumerator.new do |yielder|
    loop do
      date += 1
      yielder << date unless date.saturday? || date.sunday?
    end
  end
end

puts future_working_days.take(3)
# 2017-02-01
# 2017-02-02
# 2017-02-03