Ruby Unbound Methods: возможно ли принудительное связывание с экземплярами других классов?
Я хотел бы знать, могу ли я заставить это случиться
class A
def bomb ; "bomb" ; end
end
class B ; end
bomb = A.instance_method(:bomb)
b = B.new
bomb.bind(b)
в настоящее время он выдает ошибку TypeError: аргумент bind должен быть экземпляром A
Я считаю это очень ограниченным в отношении того, что я могу сделать с этими несвязанными методами, возможности немного ограничены. В таких случаях (и я не имею в виду только идемпотентные функции) это имеет смысл? И было бы достаточно выполнить ошибку выполнения. В случае, если я буду обрабатывать переменные из A, которые не реплицируются в B. Мне очень хотелось бы знать, как заставить это связывание.
Ответы
Ответ 1
Вы не можете связать экземпляр класса с методом другого класса.
Если экземпляр не является объектом этого класса или его подклассов.
И это тоже очевидно, деталь одного класса не может быть перенесена на экземпляр другого класса. Он может быть связан только с тем экземпляром, которому разрешено переносить ту информацию, которая является экземпляром этого класса или его подкласса.
Следовательно, ruby также поддерживает инкапсуляцию, не привязывая метод конкретного класса к экземпляру другого класса.
Ответ 2
Типы методов и UnboundMethod предполагают, что цель привязки должна быть подклассом исходного класса, на который вы ссылались на метод. Преобразование метода в proc устраняет ограничение подкласса, но только метод имеет метод to_proc
.
class A
def bomb ; "bomb" ; end
end
class B ; end
bomb = A.new.method(:bomb)
B.send(:define_method, :bomb_in_b, &bomb) #converting to proc
b = B.new
puts b.bomb_in_b
Протестировано в Ruby 2.2.3