Добавить объект nil как элемент массива в Ruby - PullRequest
2 голосов
/ 13 августа 2010

Могу ли я иметь массив, который содержит nil в качестве значения? Например, [1, 3, nil, 23].

У меня есть массив, в котором я присваиваю nil, например, array = nil, итогда я хочу повторить это, но я не могу.Метод .each не может сказать nil class.

Возможно ли это сделать?

Ответы [ 5 ]

9 голосов
/ 13 августа 2010

Использование:

a = [nil]

Пример:

> a = nil
=> nil
> a.each{|x|puts x}
NoMethodError: undefined method `each' for nil:NilClass
        from (irb):3
        from :0

> a= [nil]
=> [nil]
> a.each{|x|puts x}
nil
=> [nil]
3 голосов
/ 13 августа 2010

Конечно, вы можете. Вы, вероятно, пытаетесь что-то сделать с объектом nil, не проверяя, является ли он nil? первым.

C:\work>irb
irb(main):001:0> a = [1,2,nil,3]
=> [1, 2, nil, 3]
irb(main):003:0> a.each{|i|
irb(main):004:1* if i.nil? then
irb(main):005:2* puts ">NADA>"
irb(main):006:2> else
irb(main):007:2* puts i
irb(main):008:2> end
irb(main):009:1> }
1
2
>NADA>
3
=> [1, 2, nil, 3]
irb(main):010:0>
3 голосов
/ 13 августа 2010

Я думаю, вы путаете добавление элемента в массив с присвоением переменной значения nil.

Добавление элемента в (конец) массива (двумя способами):

array.push(item)
# or if you prefer
array << item
# works great with nil, too
array << nil

Я предполагаю, что массив уже существует. Если это не так, вы можете создать его с помощью array = [] или array = Array.new.

С другой стороны, array = nil назначает nil переменной, которая (вводит в заблуждение) с именем 'array' Если эта переменная ранее указывала на массив, это соединение разрывается.

Возможно, вы думаете о назначении с индексной позицией, но array[4] = nil очень отличается от array = nil.

3 голосов
/ 13 августа 2010

Я полагаю, что ваша проблема заключается в том, что вы "назначаете nil" для массива

arr = []
arr = nil

Это что-то вроде того, что вы пытались сделать? В этом случае вы не назначаете nil массиву, который вы назначаете nil переменной arr, следовательно, arr теперь nil, что дает вам ошибки относительно "нулевого класса"

0 голосов
/ 13 августа 2010

use Enumerable # map

ruby-1.8.7-p249 > [1,2,nil,4].map{|item| puts item}
1
2
nil
4
 => [nil, nil, nil, nil] 

обратите внимание, что, хотя для каждого элемента массива возвращается ноль, исходный массив остается таким же, как был.если вы сделаете что-то для каждого элемента в массиве, он вернет значение каждой операции.Вы можете избавиться от нуля, купив его.

ruby-1.8.7-p249 > [1,2,nil,4].map{|item| item + 1 unless item.nil? }
 => [2, 3, nil, 5] 
ruby-1.8.7-p249 > [1,2,nil,4].map{|item| item + 1 unless item.nil? }.compact
 => [2, 3, 5] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...