lambda中的Ruby-Boolean求值

lambda中的Ruby-Boolean求值,ruby,lambda,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) 我希望输

我有以下代码:

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) 
它很好用。知道为什么会这样吗

condition ? if_true : if_false
在上面,
条件
是一个过程,因此它总是真实的。当您定义
map
时,将执行来自条件映射的proc,并返回由
定义的proc if\u true
(因为条件已满足)。因此,在执行映射时,始终会调用
inspect
方法。这不是办法

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

是的,我知道了。可能我问了一个不正确的问题:为什么不计算lambda
条件
?很抱歉问了个愚蠢的问题,但只是从ruby开始。因为你没有告诉它。但是问题是,即使您对其进行评估,它也会在创建地图时被调用,因此您的
地图
将始终是
if\u true
if\u false
过程之一,甚至在您传递任何对象之前。我无法调用
地图
的创建,因为我还没有对象来检查它是否是散列。基本上,我不能让lambda返回布尔值并在
if
语句中使用它。因为lambda是一个对象而不是零,所以总是真的……是的,你是对的——你不能这样做。你需要找到另一种方法。我个人不会用
咖喱
,因为它让人难以置信地无法阅读。只需将
条件映射定义为一个包含三个参数的常规方法。