Я хочу предотвратить итерацию массива nil.
Как это сделать в рубине?
Мое плохое решение:
if nil!=myArr
myArr.each { |item|
p item;
}
end
Я хочу предотвратить итерацию массива nil.
Как это сделать в рубине?
Мое плохое решение:
if nil!=myArr
myArr.each { |item|
p item;
}
end
В рубине только nil
и false
считаются ложными.
if myArr
myArr.each { |item|
p item
}
end
Для простой однострочной линии вы также можете использовать unless myArr.nil?
myArr.each { |item| p item } unless myArr.nil?
Если вам удобнее возвращать nil
, а не полностью выполнять выполнение, вы можете использовать Безопасный навигатор &.
. Обратите внимание, что это немного отличается. Если версия unless
полностью пропустит выполнение, &.
выполнит, а вернет nil
.
myArr&.each { |item| p item }
# returns nil
Вы можете обернуть значение массива в Array()
.
Array(myArr).each { |item| p item }
Согласно документации выполните следующее:
Массив также может быть создан с использованием метода Array(), предоставленного Kernel, который пытается вызвать to_ary, а затем to_a по его аргументу.
В принципе, это преобразует значение nil
в []
. Который не будет ни перебирать, ни бросать ошибку. Справедливое предупреждение, оно будет делать то же самое с любой ценностью. Array("string")
создаст ["string"]
.
Просто проверка на nil не всегда достаточна. Иногда переменная, которую вы ожидаете быть массивом, может быть инициализирована как объект без массива, когда есть только один. Это не распространено, но проприетарные службы, которые я видел, могут дать вам результат nil
, "Name1"
или ["Name1", "Name2", ...]
. Чтобы надежно управлять этим диапазоном ввода, я предпочитаю обращаться к моим массивам следующим образом:
Array.wrap(myArr).each { |item|
p item
}
Array.wrap
преобразует nil
в []
, Object
в [Object]
и оставит существующие массивы в покое. Кроме того, удобно не замалчивать ваши хеши, если вы проходите вместо массива. (Вызов Array(myArr)
преобразует myArr
в массив, который уничтожает хэши, а не обертывает их в массивы.
В качестве альтернативы, используя andand
myArr.andand.each { | item| p item }
myArr ||= []
а затем итерации. Это присвоит пустой массив myArr, только если он равен нулю.