2012-08-10 37 views
14

Bir yöntemi yeniden tanımlamak istiyorum, ancak bununla ilişkili uyarılardan kaçının. Undef_method veya remove_method kullanmalı mıyım? undef_method ne zaman kullanılır ve remove_method ne zaman kullanılır?

(Evet, yöntemler yeniden tanımlanması Ben birim testler çalışmasını olup kullanmak istediğiniz bazı Memoization var çünkü ben yapıyorum. Biraz hacky ama programın kendisi çalıştırılır değilken.)

cevap

20

fine manual Gönderen: kendine →

undef_method (sembol)

adlı yönteme çağrılarına yanıt güncel sınıfını önler. Yöntemi, belirli bir sınıftan silen, remove_method ile karşılaştırın; Ruby, olası bir alıcı için üst sınıf ve karışık modda arama yapmaya devam edecektir.

Yani bir böyle remove_method: def m sınıfa yöntemi m ekleyen

class CC < C 
    def m 
    end 
end 

, remove_method :mm kaldırır:

class CC < C 
    remove_method :m 
end 

esasen bunun tersidir. Ancak, süper sınıf bir m yöntemine sahipse, bu hala kullanılmaya devam edecektir. Eğer böyle hitap çalışırsanız şikayet Yani undef_method aslında yöntemini kaldırmaz, bu Ruby neden olan özel bir iç bayrağıyla yöntemini değiştirir

class CC < C 
    def m 
     raise 'No, you cannot do that.' 
    end 
end 

:

undef_method

, OTOH, daha böyledir yöntem. Varolan yöntemini değiştirip değiştirmeye çalışıyorsanız gibi

semantik yüzden remove_method muhtemelen daha uygundur eklemek bir ardından kaldırmak aynıdır geliyor. Bununla birlikte, paranoyak olmak ve değiştirme yönteminin yerinde olduğundan emin olmak istiyorsanız, undef_method yararlı olacaktır; ya da, eğer bir sebepten dolayı yöntemi tek bir yerde kaldırmanız ve diğerine eklemeniz gerekirse, undef_method en azından işin sadece yarısını yaptığınızı söylerse, remove_method sizi süper sınıfın uygulamasıyla (ve olası garip böceklerle)) veya oldukça kafa karıştırıcı bir NoMethodError.

+0

Müthiş Açıklamalar gelen

x main.rb. –

4

Bir yöntemi iki kolay şekilde kaldırabilirsiniz. Devralınan olanlar da dahil olmak üzere tüm yöntemleri kaldırır. . nazik

Module#remove_method() 

alıcıdan yöntemi kaldırır, fakat tek başına yöntemleri kalıtsal bırakır.# Için ': undefined method x'(NoMethodError)

: 15: main.rb -

class A 
    def x 
     puts "x from A class" 
    end 
end 

class B < A 
    def x 
     puts "x from B Class" 
    end 
    undef_method :x 
end 

obj = B.new 
obj.x 

sonuç undef_method kullanılarak

Örnek 1 -

2'nin altında basit örneğe bakın

Örnek 2 using_method

class A 
    def x 
     puts "x from A class" 
    end 
end 

class B < A 
    def x 
     puts "x from B Class" 
    end 
    remove_method :x 
end 

obj = B.new 
obj.x 

Sonucu - $ yakut A sınıfından

İlgili konular