#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