Возможно, я что-то неправильно понимаю, но я думаю, что этот вопрос пытается сделать что-то, что не имеет смысла.
В Ruby отправка сообщения объекту означает, что этот объект должен каким-то образом ответить на запрошенное сообщение (которое в данном случае обозначается символом).Сообщение - это то, что мы обычно называем вызовом метода.В этом примере «send» - это сообщение, отправленное объекту, а объект, который получает сообщение «send», принимает переданные аргументы (символ для другого метода) и отправляет себе (объекту) сообщение, соответствующее методу дляпропущенный символ
Таким образом, отправка объекта nil почти равносильна тому, чтобы ничего не отправлять объекту, за исключением того, что вы уже фактически отправили объекту сообщение, только одно, которое не имеет никакого содержимого.Таким образом, объект неизбежно запутывается в отношении того, что он должен делать, поскольку ему было сказано ничего не делать.Разве вы не будете смущены, если кто-то потребует, чтобы вы ничего не делали? :)
Итак, обратимся к конкретному вопросу:
Перефразирую ваш вопрос (чтобы понять, понимаю ли я его),Я думаю, что вы спрашиваете: возможно ли объединить в цепочку серию вызовов, при которых один из вызовов в цепочке происходит, только если переменная (метод, вызываемый посредством отправки сообщения) не равна нулю?
Возможно, это лучше для решения общего назначения?
obj2 = obj1.obj2
obj2 = obj2.send( val ) if val
obj2.obj3.obj4
В противном случае, чтобы действительно ответить на ваш вопрос (который сейчас имеет смысл, но может сделать вещи более запутанными), вы можете поместить это в свой класс:
def send( method, *args )
super if method
end
В качестве альтернативы вы можете сделать это:
class Object
def send( method, *args )
super if method
end
end
, что заставит каждый объект принимать ноль (и ничего не делать) для отправки.
Это решение будетвызвать предупреждение [sic]:
предупреждение: переопределение ` send 'может вызвать серьезную проблему
Вы можете отключить это предупреждение, перенаправив $ stderr, но это не потокобезопасно(говорит Мац из краткого поиска Google).