传递给每个代码块的代码块使用括号而不是'do' - 'end'(ruby)

age*_*eto 3 ruby

我最近开始学习ruby,我知道你可以使用这两种语法的代码块.但我刚发现一个我不明白的案例:

#my_hash is a hash in which the keys are strings and the values arrays, but dont think about the specifics fo the code

#if I run my code like this, it works perfectly

my_hash.each do |art|
  puts mystring.gsub(art[0]).each {
    art[1][rand(art[1].length) -1]
  }
end

#but if I use this, it prints "Enumerator"

my_hash.each do |art|
  puts mystring.gsub(art[0]).each do
    art[1][rand(art[1].length) -1]
  end
end
Run Code Online (Sandbox Code Playgroud)

是因为你不能窝对端对吗?我使用的是1.9

Gui*_*nal 8

puts mystring.gsub(art[0]).each do
  art[1][rand(art[1].length) -1]
end
Run Code Online (Sandbox Code Playgroud)

在这里你puts没有parens 调用,do ... end指的是puts方法,它对块和打印没有任何作用mystring.gsub(art[0]).each(使用是a Enumerator).

{ ... }被称为与最近的方法.变得丑陋,但你可以用do ... end:

puts(mystring.gsub(art[0]).each do
  art[1][rand(art[1].length) -1]
end)
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,将结果放在变量中并打印变量:

var = mystring.gsub(art[0]).each do
  art[1][rand(art[1].length) -1]
end
puts var
Run Code Online (Sandbox Code Playgroud)

无论如何,each不要改变对象,它只是迭代并返回对象本身.您可能想要该map方法,进行测试.