我有一个整数,浮点数和布尔值的数组。我想将所有元素转换为浮点数。
如果它只是整数和浮点数,我可以做类似的事情:
my_array.map(&:to_f)
然而,布尔人对此感到困惑。
我可以写一个这样的函数:
def my_object_to_float(var)
if(var.is_a?(Integer))
return var.to_f
elsif(var.is_a?(Float))
return var
else
return var ? 1.0 : 0.0
end
end
但有没有办法从地图中调用此函数,如下所示:
my_array.map(&:my_object_to_float)
答案 0 :(得分:4)
是
> my_array.map(&method(:my_object_to_float))
它可以更清洁,例如,
def object_to_float(var)
if var.is_a?(Integer)
var.to_f
elsif var.is_a?(Float)
var
else
var ? 1.0 : 0.0
end
end
> a = [1, 2.0, true, false]
> puts a.map(&method(:object_to_float))
1.0
2.0
1.0
0.0
您还可以检查对象是否响应to_f
并使用已定义的任何内容,并对其余类型使用真实性,例如,
def object_to_float(obj)
obj.respond_to?(:to_f) ? obj.to_f : obj ? 1.0 : 0.0
end
当然,嵌套的三元组很糟糕。
答案 1 :(得分:3)
使用case
语句和lambda
,您的代码可能会更清晰:
object_to_float = lambda { |x|
case x
when Float then x
when Numeric then x.to_f
when true then 1.0
else 0.0
end
}
p [1, 2, true, false, nil, 3.0].map(&object_to_float)
# [1.0, 2.0, 1.0, 0.0, 0.0, 3.0]
答案 2 :(得分:0)
def true.to_f; 1.0 end
def false.to_f; 0.0 end
my_array.map(&:to_f)