根据位置不同地映射数组的元素

时间:2011-03-20 00:58:32

标签: ruby

我想映射数组的元素,以便所有元素 数组是浮点数,除了第一个元素 是一个字符串。

任何人都知道我该怎么做?

试过这个但不起作用:

arr = arr.map { |e| e.to_i if e != arr.first }

5 个答案:

答案 0 :(得分:2)

另一种解决方案是

[array.first] + array.drop(1).map &:to_f

这清楚地表明您希望第一个元素与其余元素分开,并且您希望其余元素的类型为Float。其他选择包括

array.map { |element, index| index == 0 ? element : element.to_f }
array.map { |element| element == array.first ? element : element.to_f }

答案 1 :(得分:1)

您可以在此处使用简短的三元表达式:

a.map { |e| ( e == a.first ) ? e : e.to_f }

答案 2 :(得分:1)

另一个选项(如果您不想使用三元运算符)是执行以下操作:

arr = arr.map { |e| (e == arr.first) && e || e.to_f}

讨论了这个替代方案here。这种方法的一个限制是数组中的第一个元素不能是nil(或者在布尔评估中会评估为false的其他值),因为如果是这样,它将计算为||表达式并返回e。 to_f而不仅仅是e。

答案 3 :(得分:1)

仅限Ruby 1.9?

arr = arr.map.with_index { |e, i| i.zero? ? e.to_s : e.to_f }

答案 4 :(得分:1)

您可以询问对象本身是否为数字。

"column heading".respond_to?(:to_int) # => false
3.1415926.respond_to?(:to_int) # => true

new_arr = arr.map do |string_or_float|
  if string_or_float.respond_to?(:to_int)
    string_or_float.to_int # Change from a float into an integer
  else
    string_or_float # Leave the string as-is
  end
end

respond_to?(:to_int)表示“我可以致电to_int吗?”

to_int是一种方法,只有易于转换为整数的对象才有。与to_i不同,它是“我不是很像整数,但你可以尝试将我转换为整数”,to_int表示“我非常喜欢整数 - 转换我完全自信地变成一个整数!“