2012-11-05 11 views
11

BenRuby Unbound Yöntemleri: Diğer sınıfların örneklerine bağlanmak zor olabilir mi? bağlama argümanı bu çok ne yapabileceğime dair sınırlayıcı buluyorum A</p> <p>örneğidir olmalıdır:

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.instance_method(:bomb) 

b = B.new 
bomb.bind(b) 

bunun olmasını zorunlu kılabilir şu anda hata TypeError atarsa ​​öğrenmek istiyorum Bu bağlanmamış yöntemlerle, olasılıklar biraz sınırlayıcıdır. Bu gibi durumlarda (ve sadece idempotent işlevlerine atıfta bulunmuyorum) doğru olur mu? Ve bir yürütme hatası yeterli olurdu. Eğer B'den çoğaltılamayan A'dan gelen değişkenleri ele alırsam, bu bağlamayı nasıl zorlayacağımı bilmek isterim.

+0

mümkündür ilginç bir şey test edilmiştir. ("Merhaba dünya") .bind call # => "# "'. Bağlantınızı örnekleminizde zorlamak mümkün değil sanırım. –

+2

Evet, Dize, Object öğesinden devraldığı ve süper sınıf örnek yöntemlerini çocuk sınıf örneklerine bağlayabilmenizdir. Bir örnek: A sınıfı; def t; "A"; son ; son ; sınıf B ChuckE

+0

eğer 'A' bir 'modül' olurdu, o zaman yakut 2'de mümkündür –

cevap

2

Sınıfın örneğini başka bir sınıfın yöntemiyle bağlayamazsınız. Örnek, bu sınıfın veya alt sınıflarının bir nesnesi değilse.

Ve bu da açıktır, bir sınıfın ayrıntısı diğer sınıfın örneğine aktarılamaz. Yalnızca o sınıfın veya alt sınıfının örneğini taşıyan bilgiyi taşımaya yetkili olan vakayla bağlanabilir. Bu nedenle, yakut ayrıca, başka bir sınıfın örneğine belirli bir sınıfın yöntemini bağlayarak kapsüllemeyi de sürdürmektedir.

0

Yöntem ve UnboundMethod türleri bağlama hedefinin, yöntemi başvuruda bulunduğunuz orijinal sınıfın alt sınıfı olması gerektiğini bekler. Yöntemi proc'ye dönüştürmek, alt sınıf kısıtlamasından kurtulur, ancak yalnızca Metot, uygulanan to_proc yöntemine sahiptir. `Object.instance_method (: to_s)

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