Ruby: почему я не получаю nil при использовании оператора безопасной навигации

#ruby

#ruby

Вопрос:

Я читал о безопасном операторе. Насколько я понимаю, он будет вызывать метод для объекта, но мы получим nil, если этот объект не существует.

 2.3.1 :001 > 123amp;.to_s
 => "123" 
 

Но когда я пытаюсь использовать его при вызове метода для объекта, который не существует, я получаю:

 2.3.1 :003 > fooamp;.to_s
NameError: undefined local variable or method `foo' for main:Object
Did you mean?  fork
    from (irb):3
    from /Users/duncan/.rvm/rubies/ruby-2.3.1/bin/irb:11:in `<main>'
 

Что я делаю не так? Я неправильно понял оператор amp; ?

Ответ №1:

Это не работает, если ваша переменная не определена. Вы можете использовать defined? и отложенную оценку

пример:

 defined?(foo) ? fooamp;.to_s : nil
#=> nil
foo = 3
defined?(foo) ? fooamp;.to_s : nil
#=> "3"
 

Комментарии:

1. defined? это не метод, а языковая конструкция

Ответ №2:

Оператор safe navigator избавляет вас от вызова методов для объекта NilClass, но приемник должен быть определен. Бессмысленные, но полезные примеры

 a = [-3, -2, -1]
a.find_index(-3).zero? # true
a.find_index(5)amp;.zero? # nil
a.find_index(5).zero? # NoMethodError: undefined method `zero?' for nil:NilClass
 

to_s это плохой пример, потому nil.to_s что это пустая строка. Давайте использовать split

 "asd-lol".split("-") # ["asd", "lol"]
nilamp;.split("-") # nil
nil.split("-") # NoMethodError: undefined method `split' for nil:NilClass