2017-02-21 5 views
5

私はRubyで簡単な作業をするのに奇妙なことに出くわしました。私は、それぞれの方法でアルファベットを反復処理したいが、反復が実行中で最初に行く:この中Rubyの各イテレータが最初に実行されるのはなぜですか?

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 

それは同じように動作し、なぜすべてのアイデアをこれ、あるいは私が間違っていたと思われることは?

ありがとうございます。

+0

あなたの期待される結果は何ですか? – Stefan

+0

Ursusによって正しく行われているように、 "That's an alphabet"の後のアルファベットをリストします。私は反復を、私がやったように入れ子にすることができると思っていました。 – Michalko

答えて

5

あなたのeachコールは固定文字列の前に実行される文字列リテラルで補間されるためです。また、eachEnumerableを返します。あなたがしたい場合は、補間を使用することができますが、あなたに補間部を抽出する場合は、この方法

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

ありがとうございます。私は数日間それがとてもシンプルであったことを理解するのに苦労していました。 – Michalko

+1

私の喜びSir :) – Ursus

3

であなたは簡単に何が起こっているのを見ることができます。この1

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") 
foo = alfawit.each { |litera| puts litera } 
puts "That's an alphabet: \n\n #{ foo } " 

2行目で問題が発生しています。eachは、範囲の各要素に対してブロックを呼び出してから受信者を返します。fooalfawitになります。ここで

は、所望の結果を得るために別の方法です:

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" 
関連する問題