7

benim web uygulaması üzerinde çalışıyordu ve ben orijinal sınıf Ben bualias_method ve alias_method_chain arasındaki fark nedir?

class A 
    alias_method :old_foo, :foo 
    def foo 
    old_foo + ' and another foo' 
    end 
end 

gibi yapılabilir foo yöntemi geçersiz istiyorum

class A 
    def foo 
    'original' 
    end 
end 

ise örneğin bir yöntemi geçersiz istedi ve ben erişebilir ve yol gibi her iki yöntem tutabilir eğer öyleyse alias_method_chain kullanımı nedir bu

obj = A.new 
obj.foo #=> 'original and another foo' 
obj.old_foo #=> 'original' 

gibi hem eski hem de yeni yöntemler arayabilirler Yaptım ?

alias_method :do_something_without_something_else, :do_something 
alias_method :do_something, :do_something_with_something_else 
:

alias_method_chain :do_something, :something_else 

eşdeğerdir hangi:

cevap

7

alias_method_chain

alias_method

Eğer yöntemini do_something varsa ve eski yöntem tutarak bunu geçersiz kılmak isterseniz, yapabileceğiniz farklı davranır

Bu, örneğin özel günlük kaydı ekleyerek, yöntemi kolayca geçersiz kılmamıza olanak tanır. Geçersiz kılmak istediğimiz do_something yöntemiyle Foo sınıfını düşünün. Biz yapabiliriz:

class Foo 
    def do_something_with_logging(*args, &block) 
    result = do_something_without_logging(*args, &block) 
    custom_log(result) 
    result 
    end 
    alias_method_chain :do_something, :logging 
end 
Yani iş yapmış

, yapabileceğiniz:

class A 
    def foo_with_another 
    'another foo' 
    end 
    alias_method_chain :foo, :another 
end 
a = A.new 
a.foo # => "another foo" 
a.foo_without_another # => "original" 

değil çok karmaşık olduğu için, ayrıca düz alias_method ile yapabilirsiniz:

class A 
    def new_foo 
    'another foo' 
    end 
    alias_method :old_foo, :foo 
    alias_method :foo, :new_foo 
end 
a = A.new 
a.foo # => "another foo" 
a.old_foo # => "original" 

Daha fazla bilgi için, bkz. documentation.

+1

Bu, alias_method_chain' için iyi bir açıklamadır, ancak sorunun biraz farklı olduğunu düşünüyorum. –

+0

Teşekkürler, ama alias_method_chain bitti ne, soruyorum ne ben alias_method ile yapabilirim benim örneğim gibi gerçek farkı ne sonra iki yol arasında? –

+0

@ M.ElSaka bütün cevabı okudunuz mu (ve sonra düzenleme)? –

İlgili konular