Я думаю, вы могли бы пойти с чем-то таким простым, как
class Object
def fast_try(meth,*args,&block)
self&.public_send(meth,*args,&block)
end
end
Например:
["string","STRING","pOw"].map do |s|
s.fast_try(:upcase!)
.fast_try(:chars)
.fast_try(:find, ->{"No S"}) { |a| a == "S" }
.fast_try(:prepend, "!")
end
#=> ["!S",nil,"!No S"]
Пока ваш вопрос гласит, "Нет, мне все равноо незначительных различиях в поведении между оператором try и безопасной навигацией. ", учитывая тот факт, что вы написали гем и отметили следующие
Различия между FastTry и ActiveSupport # try
Наша цель - не поддерживать соответствие с версией ActiveSupport метода try.Однако я хочу вести простой список различий.Пожалуйста, создайте PR или Issue, если вы найдете разницу, которая должна быть задокументирована здесь.
Пока ничего не сообщается
Мне кажется благоразумным упомянуть, что есть заметные и потенциально острые,Различия между двумя здесь - это Repl Spec , чтобы показать различия и ради этого ответа, и тот факт, что ссылка может умереть, вывод этой спецификации выглядит следующим образом:
ActiveSupport#try vs. Safe Navigation (&.)
#try
handles would be NoMethodError with nil (using #respond_to?)
does not work on a BasicObject
behaves like a method call
with no method name given
when block_given?
yields self to a block with arity > 0
evaluates block with arity == 0 in the context of self
when no block_given?
raises an ArgumentError
with a method_name given
a non nil object
uses public_send for message transmission
nil
calls NilClass#try and returns nil
#try!
does not handle NoMethodError
does not work on a BasicObject
behaves like a method call
with no method name given
when block_given?
yields self to a block with arity > 0
evaluates block with arity == 0 in the context of self
when no block_given?
raises an ArgumentError
with a method_name given
a non nil object
uses public_send for message transmission
nil
calls NilClass#try and returns nil
&. (safe navigation)
does not handle NoMethodError
raises a SyntaxError with no method name given when block_given?
raises a SyntaxError with no method name given when no block_given?
works on a BasicObject
does not act like a method call
with a method_name given
a non nil object
&. is not called
nil
returns nil without a method call