Вы не понимаете, что делает try
.Из точного руководства :
try (* a, & b)
Вызывает метод, обозначенный символом method
, передавая его любомуаргументы и / или указанный блок, как это делает обычный Ruby Object#send
.
В отличие от этого метода, однако, исключение NoMethodError
будет не , а nil
будетвместо этого возвращается, если получающий объект является nil
объектом или NilClass.
Таким образом, это:
t.try(:aoeu)
более или менее совпадает с этим:
t.nil?? nil : t.aoeu
но вы, похоже, ожидаете, что он будет вести себя так:
t.respond_to?(:aoeu) ? t.aoeu : nil
Ваш t
не nil
, поэтому t.try(:aoeu)
совпадает с t.aoeu
.У вашего класса Tag нет метода aoeu
, поэтому вы получаете NoMethodError
.
try
- это просто удобный способ избежать проверки nil
, это не способ избежатьNoMethodError
когда объект не отвечает на метод, который вы пытаетесь использовать.