2012-11-05 15 views
11

Vorrei sapere se potevo forzare questo accadaMetodi non utilizzati di Ruby: è possibile forzare il binding alle istanze di altre classi?

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.instance_method(:bomb) 

b = B.new 
bomb.bind(b) 

attualmente getta la TypeError errore: argomento bind deve essere un'istanza di A

Trovo che questo sia molto limitante per quanto riguarda quello che posso fare con questi metodi non associati, le possibilità sono un po 'limitanti. In casi come questi (e non mi riferisco solo alle funzioni idempotenti) avrebbe senso, no? E sarebbe bastato un errore di esecuzione, nel caso in cui dovessi gestire variabili da A che non sono replicate in B. Mi piacerebbe davvero sapere come forzare questo legame.

+0

qualcosa di interessante che è possibile: 'Object.instance_method (: to_s). .bind ("ciao mondo") chiamare # => "# "'. Non credo che sia possibile forzare l'associazione nel tuo esempio. –

+2

Sì, questo perché String eredita da Object ed è possibile associare i metodi di istanza superclass alle istanze di classe child. Un esempio: classe A; def t; "A"; fine ; fine ; classe B ChuckE

+0

se 'A' sarebbe stato un' modulo', quindi è possibile in ruby ​​2 –

risposta

2

Non è possibile associare l'istanza di una classe al metodo di un'altra classe. A meno che l'istanza non sia un oggetto di questa classe o delle sue sottoclassi.

E anche questo è ovvio, il dettaglio di una classe non può essere trasferito ad un'altra classe. Può essere associato solo a quell'istanza autorizzata a trasportare quell'informazione che è l'istanza di quella classe o della sua sottoclasse.

Quindi ruby ​​mantiene anche l'incapsulamento mediante il metodo non vincolante di una classe particolare a un'istanza di un'altra classe.

0

I metodi Method e UnboundMethod si aspettano che il target di collegamento debba essere sottoclasse della classe originale a cui è stato fatto riferimento al metodo. La conversione del metodo in proc elimina il vincolo della sottoclasse, ma solo il metodo ha implementato il metodo 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 

Testato in Ruby 2.2.3

Problemi correlati