/ / Ruby: spúšťanie singletonovej metódy v rôznych kontextoch - ruby, metaprogramovanie, singletonové metódy

Ruby: vykonať metódu singleton v rôznych kontextoch - ruby, metaprogramovanie, singleton-metódy

(upravená tak, aby bola otázka konkrétnejšia)

Chcel by som vedieť, či je možné vykonať singletonovú metódu v kontexte iného objektu, ako v nasledujúcom príklade:

class A
def initialize
@foo = "foo"
end
end

def A.singleton(*args)
puts "in singleton"
puts @foo
end

A.new.instance_eval &A.method(:singleton)

# output is:
# - in singleton

# desired output:
# - in singleton
# - foo

odpovede:

0 pre odpoveď č. 1

Toto nie je možné. V skutočnosti má Ruby špecifickú chybu, keď sa o to pokúsite:

module Foo
def self.bar
end
end

class Baz
end

Foo.method(:bar).unbind.bind(Baz.new)
# TypeError: singleton method called for a different object

Toto je naozaj umelé obmedzenie, pretože UnboundMethod#bind mohol jednoducho preskočiť kontrolu typu a nechať to urobiť. Bolo by však zásadným rozporom, ak by ste mohli volať metódu singleton s iným prijímačom: metóda singleton je definovaná pre jednotný inštancie. To dáva zmysel, že to nie je povolené.


0 pre odpoveď č. 2

Nemyslím si, že je to možné. A::Singletons je, samo o sebe, singleton (v zmysle Singletonovho vzoru), a tak, pretože existuje len jeden jediný A::Singletons v systéme, ale A možno includev mnohých rôznych moduloch, nie je možné sa o nich dozvedieť ktorý modul na pridanie metódy.