我可以使用ruby的.map但是也可以传入参数吗?

时间:2017-07-11 03:53:03

标签: ruby

我有一个整数,浮点数和布尔值的数组。我想将所有元素转换为浮点数。

如果它只是整数和浮点数,我可以做类似的事情:

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)

3 个答案:

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