put的多次应用

时间:2014-10-29 17:09:07

标签: ruby

我有以下定义:

class AllVowels
  @@vowels = %w{a e i o u}
  def each
    @@vowels.each {|v| yield v}
  end
end

此代码:

AllVowels.new.each {|vowels| puts vowels}

只输出一次元音:

a
e
i
o
u

而这段代码:

puts AllVowels.new.each {|vowel| puts vowel}

两次输出元音:

a
e
i
o
u
a
e
i
o
u

为什么我会得到两个元音副本?

1 个答案:

答案 0 :(得分:2)

puts AllVowels.new.each {|vowel| puts vowel}

AllVowels.new.each为每个项目调用puts vowel,从而产生第一个a e i o u。然后,凭借Ruby的隐式返回,它返回

的返回值
@@vowels.each {|v| yield v}

这是@@vowels本身,允许链接。在该数组上调用puts会产生第二个a e i o u

这可能有助于澄清事情:

vowels = AllVowels.new.each do |vowel|
    puts "In each, got #{vowel}"
end

puts "Outside of each, got #{vowels}"

Demo