Одним из вариантов использования nil
, который вы часто видите в коде Ruby, является следующее:
a ||= 10 # or a = a || 10
Это работает, потому что, как только переменная была замечена в левой части присваивания, она неявно имеетзначение ноль
>> if false
.. x = y
.. z
.. end
=> nil
>> x
=> nil
>> z
NameError: undefined local variable or method `z' for main:Object
Таким образом, когда часть a || 10
оценивается, она оценивается как nil || 10
, что дает 10.
nil
и false
также являются единственными двумя значениями вРубины, которые являются логически ложными, поэтому обычно методы возвращают nil
в случае сбоя.Существует гем под названием andand
, который использует именно это, поэтому вместо чего-то вроде
@first_name &&= @first_name.trim
вы можете написать
@first_name.andand.trim
Это в основном переводится в трим @first_name
, еслиимеет значение, отличное от nil
, в противном случае оценивается как nil
.Как вы можете себе представить, это особенно полезно при цепочечных методах, где один из посредников может потенциально вернуть nil
.
Кроме того, nil
также возвращается, когда вы пытаетесь получить доступ к несуществующим элементам коллекции, напримерв случае массивов или хэшей.Неинициализированные переменные экземпляра также имеют значение nil
.
Я не слишком разбираюсь в Python, но из того, что я видел, nil
и None
служат практически той же цели.