【问题标题】:Why the Ruby each iterator goes first in the execution?为什么 Ruby 每个迭代器在执行中都排在第一位?
【发布时间】:2017-07-10 20:51:09
【问题描述】:

我在 Ruby 中执行简单任务时遇到了一件奇怪的事情。我只想用 each 方法迭代字母表,但迭代首先在执行中进行:

alfawit = ("a".."z")
puts "That's an alphabet: \n\n #{ alfawit.each { |litera| puts litera } } "

这段代码的结果是:(缩写)

a
b
c
⋮
x
y
z
That's an alphabet: 

 a..z 

任何想法为什么它会这样工作或者我做错了什么?

提前致谢。

【问题讨论】:

  • 您的预期结果是什么?
  • 在“这是一个字母表”之后列出字母表,就像 Ursus 正确完成的那样。我曾以为我能够按照我的方式嵌套迭代。

标签: ruby iteration each puts


【解决方案1】:

因为您的 each 调用被插入到在固定字符串之前执行的字符串文字中。此外,each 返回一个Enumerable,实际上你甚至打印了那个。试试这个

alfawit = ("a".."z")
puts "That's an alphabet: \n\n"
alfawit.each { |litera| puts litera } 

puts "That's an alphabet: \n\n"
("a".."z").each { |litera| puts litera } 

如果你愿意,你可以使用插值,但以这种方式

alfawit = ("a".."z")
puts "That's an alphabet: \n\n#{alfawit.to_a.join("\n")}"

【讨论】:

  • 谢谢。几天来我一直在努力理解这一点,但这很简单。
  • 我的荣幸先生 :)
【解决方案2】:

如果将插值部分提取到变量中,您可以轻松查看发生了什么:

alfawit = ("a".."z")
foo = alfawit.each { |litera| puts litera }
puts "That's an alphabet: \n\n #{ foo } "

第二行引起了麻烦:each 为范围的每个元素调用块,然后返回接收者,这样foo 就变成了alfawit

这是获得所需结果的另一种方法:

alfawit = "a".."z"
puts "That's an alphabet:", alfawit.to_a

puts 在新行上输出每个参数,但对于数组参数,它在新行上输出每个 元素。结果:

That's an alphabet:
a
b
c
⋮
x
y
z

同样,您可以通过* 将范围转换为argument list

alfawit = "a".."z"
puts "That's an alphabet:", *alfawit

相当于:

puts "That's an alphabet:", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"

【讨论】:

    最近更新 更多