(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ď č. 1Toto 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 include
v mnohých rôznych moduloch, nie je možné sa o nich dozvedieť ktorý modul na pridanie metódy.