如果我在此代码上运行以下测试,则返回
ALERT: an event that always happens
我预计它也会放
ALERT: an event that never happens
但事实并非如此。我认为差异的原因是各自测试中的'真实'和'假',但我不明白为什么'真'或'假'在这种情况下有所作为。方法'事件'说
puts "ALERT: #{name}" if yield
如果测试的结果是由'true'等于'yield'在这种情况下解释的事实,而'false'则没有,'false'如何否定'yield'?
问题:'如果收益'是否意味着'收益率,如果该块评估为真'?
码
def event(name)
puts "ALERT: #{name}" if yield
end
Dir.glob('*events.rb').each {|file| load file }
测试
event "an event that always happens" do
true
end
event "an event that never happens" do
false
end
输出
ALERT: an event that always happens
答案 0 :(得分:4)
这可能会有所帮助。
def event(name)
val = yield
puts val.inspect
puts "ALERT: #{name}" if val == "donald"
end
event "an event that always happens" do
"donald"
end
event "an event that never happens" do
"duck"
end
打印
"donald"
ALERT: an event that always happens
"duck"
基本上,yield的返回值是块中最后得到的值。这就是在if语句中用作标准的内容。
答案 1 :(得分:2)
问题:“如果收益率”是指'如果块评估为真的收益'吗?
不,if yield
表示if((执行块的结果)),也就是说总是计算块,并将其结果用作if语句的条件。
puts "..." if yield
表示“仅在真实时放置”。它相当于
if yield
then
puts "ALERT: #{name}"
这就是为什么你只看到一个输出。使用第二个事件调用时,由于if false
,put根本不会执行。试试这个:
def event(name)
result = yield
puts "the block is #{result}"
puts "ALERT: #{name}" if result
end
$ ruby -w t.rb
the block is true
ALERT: an event that always happens
the block is false
$