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