Я новичок в Ruby, и я был удивлен, когда узнал, что все объекты истинны, кроме nil и false. Даже 0 это правда.
Хорошая особенность этого свойства языка в том, что вы можете написать:
if !variable
# do stuff when variable is nil
end
Мои коллеги, которые являются более опытными разработчиками Ruby, настаивают, чтобы я выбрал это вместо использования .nil? вот так:
if variable.nil?
# do stuff when variable is nil
end
Однако я считаю, что последний вариант лучше по двум причинам: 1. Я думаю, что он более объектно-ориентирован, особенно в языке, подобном Ruby, где все является обменом объектами и сообщениями. 2. На мой взгляд, он более читабелен, даже если он менее компактен.
Я делаю ошибку "новичка" здесь?
coding-style
ruby
null
Хавьер Холгера
источник
источник
Ответы:
Напиши, что ты имеешь в виду. Имею ввиду то, что ты пишешь.
Пройдем другой тест.
.vowel?
против
Теперь очевидно, что они не делают то же самое. Но если вы только ожидая ,
char
чтобы бытьa
илиb
он будет работать. Но это запутает следующего разработчика - второй блок будет введен для условий, где[eiou]
также есть char . Но ведьa
это будет работать правильно.Да, это тот случай, когда
nil
иfalse
являются единственными ложными значениями в Ruby. Однако, если вы проверяетеnil
, проверяяnil || false
это, это не то, что вы имеете в виду.Это означает, что следующий разработчик (который оказывается убийцей сумасшедшего топора, который знает ваш домашний адрес) прочтет код и задастся вопросом, зачем
false
ему туда идти.Напишите код, который передает именно то , что вы имеете в виду.
источник
Учтите следующее:
response = responses.to_a.first
Это вернет первый элемент
responses
, илиnil
. Тогда потому что условные операторы обрабатываютnil
какfalse
мы можем написать:Который является более читабельным, чем:
if (object)
Картина очень часто встречается в Ruby - кода. Это также приводит к рефакторингу, например:Помните также, что метод Ruby возвращается
nil
по умолчанию. Так:можно упростить до:
Таким образом, мы можем продолжить рефакторинг:
Теперь вы можете утверждать, что возвращение
nil
- это не всегда лучшая идея, так как это означает, что нужно искатьnil
везде. Но это еще один чайник рыбы. Учитывая, что тестирование на предмет «наличие или отсутствие» является таким частым требованием, достоверность объектов является полезным аспектом Ruby, хотя и удивительным для новичков в языке.источник
Он не только
if variable.nil?
больше похож на естественный язык, но и защищает программиста от случайного присвоения емуfalse
значения и попадания в вашеif
утверждение, поскольку Ruby является свободно типизированным языком.источник
Идиоматически,
unless variable
предпочтительнееif !variable
. Отрицательныеif
операторы часто считаются запахом кода, так как при скимминге легче пропустить отрицание.Более общая картина здесь заключается в том, что выполнение
nil
таких проверок также является запахом кода. Для правильного OO стремитесь использовать шаблон нулевого объекта, чтобы такая проверка никогда не требовалась. http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/Скажите объектам, что делать, не спрашивайте их, кто они. Это иногда известно как сказать не спрашивай
источник