Я надеюсь, что инфраструктура передачи сообщений Ruby означает, что мог бы быть некоторый умный прием для этого.
То, как я определяю вызывающий объект - которые возражают, назвало метод, в котором я в настоящее время нахожусь?
Вы можете легко взглянуть на строку код, который вызвал интересующую функцию через
caller.first
, который сообщит вам имя файла и номер строки, которая вызвала соответствующую функцию. Затем вы могли рассчитать, какой это был объект.
Однако похоже, что вам больше нужен какой-то объект, который вызвал определенную функцию, возможно, в методе экземпляра. Я не знаю способа выяснить это, но я бы все равно не стал его использовать, поскольку он, похоже, сильно нарушает инкапсуляцию.
Вы имеете в виду self
?
irb> class Object
.. def test
.. self
.. end
.. end
=> nil
irb> o = Object.new
=> #<Object:0xb76c5b6c>
irb> o.test
=> #<Object:0xb76c5b6c>
Технология в лучшем виде:
1 # phone.rb
2 class Phone
3 def caller_id
4 caller
5 end
6 end
7
8 class RecklessDriver
9 def initialize
10 @phone = Phone.new
11 end
12 def dial
13 @phone.caller_id
14 end
15 end
16
17 p = Phone.new
18 p.caller_id.inspect # => ["phone.rb:18:in `<main>'"]
19
20 macek = RecklessDriver.new
22 macek.dial.inspect # => ["phone.rb:13:in `dial'", "phone.rb:22:in `<main>'"]
Примечание: Номер строки для демонстрационных целей. phone.rb: X
относится к строке X
скрипта.
Посмотрите phone.rb: 13
! Этот метод дозвона
- это то, что отправило вызов! А phone.rb: 22
относится к безрассудному драйверу, который использовал метод набора
!