Имеет ли Ruby синтаксис для безопасного навигатора с нулевыми значениями, например, в Groovy?
В Groovy имеется хороший синтаксис для работы с нулевыми значениями.
Например, я могу сделать оператор if:
if (obj1?.obj2?.value) {
}
Это не вызовет исключение NullPointerException, даже если obj1 имеет значение null (он будет оцениваться как false).
Это то, что очень удобно, поэтому интересно, есть ли эквивалент Ruby, который я пропустил.
Ответы
Ответ 1
В приложении rails есть Object#try
Итак, вы можете сделать
obj1.try(:obj2).try(:value)
или с блоком (как указано в комментариях ниже)
obj.try {|obj| obj.value}
UPDATE
В рубине 2.3 есть оператор для этого:
obj&.value&.foo
То же, что и obj && obj.value && obj.value.foo
Ответ 2
Это добавлено к Ruby 2.3.
Синтаксис obj1&.meth1&.meth2
.
Ответ 3
Ruby 2.3 будет поддерживать оператора безопасной навигации:
obj1&.obj2&.value
https://www.ruby-lang.org/en/news/2015/11/11/ruby-2-3-0-preview1-released/
Ответ 4
try
был единственным стандартным способом сделать это до Ruby 2.3. С Ruby 2.3 вы можете сделать:
if obj1&.obj2&.value
end
Кроме того, если у вас есть структура хэша, вы можете использовать оператор _.
с Hashie:
require 'hashie'
myhash = Hashie::Mash.new({foo: {bar: "blah" }})
myhash.foo.bar
=> "blah"
myhash.foo?
=> true
# use "underscore dot" for multi-level testing
myhash.foo_.bar?
=> true
myhash.foo_.huh_.what?
=> false