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是一个对象而不是零,所以总是真的……是的,你是对的——你不能这样做。你需要找到另一种方法。我个人不会用咖喱,因为它让人难以置信地无法阅读。只需将条件映射定义为一个包含三个参数的常规方法。