Ruby - lambda中的布尔值评估

时间:2014-04-14 22:40:53

标签: ruby lambda

我有以下代码:

def conditional_map
  ->(condition, if_true, if_false) { condition ? if_true : if_false }.curry
end
map = conditional_map.(->(object){ object.is_a?(Hash) }, ->(object) { object.inspect }, ->(object) { object.class })
map.(5)

我希望输出为Fixnum,但我得到的是object.inspect结果。但是,如果我明确声明布尔条件并进行调用,如:

map = conditional_map.(5.is_a?(Hash), ->(object) { object.inspect }, ->(object) { object.class })
map.(5) 

它运作得很好。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

condition ? if_true : if_false

在上面,condition是一个过程,因此它总是真实的。当你定义map时,你执行了来自conditional_map的proc并返回由if_true定义的proc(因为条件已满足)。因此,当您执行地图时,您将始终调用inspect方法。这不是可行的方法。

conditional_map.(1,2,3) #=> 2, since 1 is true-like