Как не перебирать nil array ruby?

Я хочу предотвратить итерацию массива nil.

Как это сделать в рубине?

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

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

Ответ 1

В рубине только nil и false считаются ложными.

if myArr
    myArr.each { |item|
      p item
    }
end

Ответ 2

Для простой однострочной линии вы также можете использовать 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

Ответ 3

Вы можете обернуть значение массива в Array().

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

Согласно документации выполните следующее:

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

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

Ответ 4

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

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

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

Ответ 5

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

myArr.andand.each { | item| p item }

Ответ 6

myArr ||= []

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