отображение элементов массива по-разному в зависимости от положения - PullRequest
0 голосов
/ 20 марта 2011

Я хочу отобразить элементы массива так, чтобы все элементы массива были числами с плавающей точкой, кроме первого элемента, являющегося строкой.

Кто-нибудь знает, как я могу это сделать?

Пробовал это, но не работает:

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

Ответы [ 5 ]

2 голосов
/ 20 марта 2011

Другое решение -

[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 голос
/ 21 марта 2011

Вы можете спросить сами объекты, являются ли они числами.

"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 означает «Я очень похож на целое число - преобразовать меня в целое число сполная уверенность! "

1 голос
/ 20 марта 2011

Ruby 1.9 только?

arr = arr.map.with_index { |e, i| i.zero? ? e.to_s : e.to_f }
1 голос
/ 20 марта 2011

Другой вариант (если вы не хотите использовать троичные операторы) заключается в следующем:

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

Эта альтернатива обсуждается здесь . Ограничение этого метода состоит в том, что первый элемент в массиве не может быть nil (или каким-либо другим значением, которое будет оценивать false в булевой оценке), потому что если это так, он будет вычислять выражение || и вместо этого будет возвращать e.to_f просто е.

1 голос
/ 20 марта 2011

Вы можете использовать короткое троичное выражение здесь:

a.map { |e| ( e == a.first ) ? e : e.to_f }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...