Назначить массиву и заменить появившиеся значения nil - PullRequest
7 голосов
/ 27 марта 2010

Привет!

При назначении значения массиву, как показано ниже, как я могу заменить nil s на 0?

array = [1,2,3]
array[10] = 2
array # => [1, 2, 3, nil, nil, nil, nil, nil, nil, nil, 2]

Если это невозможно при назначении, как я мог бы сделать это наилучшим образом после этого? Я думал о array.map { |e| e.nil? ? 0 : e }, но хорошо ...

Спасибо!

Ответы [ 6 ]

12 голосов
/ 27 марта 2010

Чтобы изменить массив после присваивания:

array.map! { |x| x || 0 }

Обратите внимание, что это также преобразует false в 0.

Если вы хотите использовать нули во время назначения , это немного грязно:

i = 10
a = [1, 2, 3]
a += ([0] * (i - a.size)) << 2
# => [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 2]
7 голосов
/ 27 марта 2010

Нет встроенной функции для замены nil в массиве, поэтому да, map - это путь. Если более короткая версия сделает вас счастливее, вы можете сделать:

array.map {|e| e ? e : 0}
1 голос
/ 27 июня 2017

nil.to_i равно 0, если все числа являются целыми числами, то ниже должно работать. Я думаю, что это также самый короткий ответ здесь.

array.map!(&:to_i)
1 голос
/ 19 сентября 2012
a.select { |i| i }

Этот ответ слишком короткий, поэтому я добавляю еще несколько слов.

1 голос
/ 27 марта 2010

Чтобы заменить массив на место

array.map!{|x|x ?x:0}

Если массив может содержать false, вам нужно использовать это вместо

array.map!{|x|x.nil? ? 0:x}
0 голосов
/ 27 марта 2010

Другой подход заключается в определении собственной функции для добавления значения в массив.

class Array
  def addpad(index,newval)
    concat(Array.new(index-size,0)) if index > size
    self[index] = newval
  end
end

a = [1,2,3]
a.addpad(10,2)
a => [1,2,3,0,0,0,0,0,0,0,2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...