“如果产量”与“产量,如果块评估为真”相同?

时间:2012-12-07 04:38:07

标签: ruby

如果我在此代码上运行以下测试,则返回

 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

2 个答案:

答案 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
$