这个红宝石计划有什么问题?
def makecassrole(ingredients)
puts "I am #{ingredients}"
yield(ingredients)
end
makecassrole do |ingredients|
puts "Preheat ovent o 375 degree"
puts "Place #{ingredients} in dish"
puts "Bake for 20 min"
end
makecassrole("noodles, celeray,and tuna")
它给我以下错误
C:/Users/akathaku/mars2/LearningRuby/rubyblock.rb:1:in `makecassrole': wrong number of arguments (0 for 1) (ArgumentError)
from C:/Users/akathaku/mars2/LearningRuby/rubyblock.rb:6:in `<main>'
我认为在调用此方法时我传递了1个参数。为什么要传递0个参数?
答案 0 :(得分:3)
在ruby中,参数和块是不同的。在此处详细了解差异:http://ruby-doc.com/docs/ProgrammingRuby/html/tut_methods.html 这可以通过两种方式处理。
即使传递一个块,一种方法也可以传递参数:
def makecassrole(ingredients)
if block_given?
yield(ingredients)
else
puts "I am #{ingredients}"
end
end
makecassrole('you need to pass some ingredient here') do |ingredients|
puts "Preheat ovent o 375 degree"
puts "Place #{ingredients} in dish"
puts "Bake for 20 min"
end
makecassrole("noodles, celeray,and tuna")
第二种方法(在我看来更优选)是使参数可选(默认参数):
def makecassrole(ingredients='some default argument')
if block_given?
yield(ingredients)
else
puts "I am #{ingredients}"
end
end
makecassrole do |ingredients|
puts "Preheat ovent o 375 degree"
puts "Place #{ingredients} in dish"
puts "Bake for 20 min"
end
makecassrole("noodles, celeray,and tuna")
我们'some default argument'
方法makecasserole
。
注意 :在block_given?
之前检查yield
是很重要的,否则当你没有传入一个块时它会失败(正如你第二次调用方法时那样)。
答案 1 :(得分:0)
在用一个参数调用它之前,你在这里用零参数(和一个块)调用它:
makecassrole do |ingredients|
puts "Preheat ovent o 375 degree"
puts "Place #{ingredients} in dish"
puts "Bake for 20 min"
end
答案 2 :(得分:0)
我认为你过度复杂,除非你试图测试yield
。
您需要首先传递它ingredients
,因为这是必需的参数,然后您可以传递一个块来使用yield
。此外,看起来你想分别传递每个食物项目,所以也许使用一个数组并迭代它。
def makecassrole(ingredients)
ingredients.each do |ingredient|
puts "I am #{ingredient}"
yield(ingredient)
end
end
makecassrole(["noodles", "celeray", "tuna"]) do |i|
puts "Prehead oven to 375 degrees"
puts "Place #{i} in dish"
puts "Bake for 20 min"
end
我认为如果您使用一种方法将所有文本放在里面并迭代各种成分,而不是使用产量,那么每种成分的打印都会简单得多。