Как я могу избежать итерации по массиву nil в Ruby? - PullRequest
11 голосов
/ 26 марта 2012

Я хочу избежать итерации по массиву nil.

Мое плохое решение:

if nil!=myArr
    myArr.each { |item|
      p item;
    }
 end

Ответы [ 6 ]

22 голосов
/ 26 марта 2012

Для простого однострочного вы также можете использовать unless myArr.nil?

myArr.each { |item| p item } unless myArr.nil?

Обновление для Ruby> = 2.3.0:

Если вам удобен возврат nil вместо полного отказа от исполнения, вы можете использовать Безопасный оператор навигации &.. Обратите внимание, что это немного отличается. В то время как версия unless полностью пропустит выполнение, &. выполнится, но вернет nil.

myArr&.each { |item| p item }
# returns nil
12 голосов
/ 26 марта 2012

В ruby ​​только nil и false считаются ложными.

if myArr
    myArr.each { |item|
      p item
    }
end
10 голосов
/ 14 октября 2015

Вы можете заключить значение массива в Array().

Array(myArr).each { |item| p item }

Согласно документации это:

Массив также можно создать с помощью метода Array (), предоставляемого Kernel, который пытается вызвать to_ary, а затем to_a в своем аргументе.

По сути, это преобразует значение nil в []. Который не будет ни повторяться, ни выдавать ошибку. Честное предупреждение, он будет делать то же самое с любой ценностью. Array("string") создаст ["string"].

2 голосов
/ 26 марта 2012

Просто проверка на ноль не всегда достаточна.Иногда переменная, которую вы ожидаете, чтобы быть массивом, может быть инициализирована как объект не массив, когда есть только один.Это не часто, но частные сервисы, которые я видел, могут дать вам результат nil, "Name1" или ["Name1", "Name2", ...].Чтобы надежно обрабатывать этот диапазон ввода, я предпочитаю обращаться к своим массивам следующим образом:

Array.wrap(myArr).each { |item|
  p item
}

Array.wrap преобразует nil в [], Object в [Object] и оставьте существующие массивы в покое.Также удобно для того, чтобы не молча распаковывать ваши хэши, если они передаются вместо массива.(Вызов Array(myArr) преобразует myArr в массив, который уничтожает хэши, а не упаковывает их в массивы.

2 голосов
/ 26 марта 2012

В качестве альтернативы, используя и and

myArr.andand.each { | item| p item }
1 голос
/ 26 марта 2012
myArr ||= []

и затем повторить. Это присвоит пустой массив myArr, только если он равен nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...