2011-04-20 23 views
6

geri dönme Bir yöntemi geçersiz kılabileceğim, bir şeyler yapabildiğim ve daha sonra etrafta herhangi bir artefakt bırakmadan bir yöntem bulmaya çalışıyorum.ruby ​​- geçersiz kılma yöntemi ve daha sonra

Bunu mocha'yı kullanarak uygulamıştım, ancak açıkçası bu bir üretim uygulamasında uçmayacak. Yeni yöntemin parametreleri olduğuna dikkat edin ve eski olanı yoktur.

Örnek

require 'rubygems' 
require 'mocha' 

class Example 

    def to_something 
    self.stubs(:attribs => other(1)) 
    r = attribs_caller 
    self.unstub(:attribs) 
    r 
    end 

    def other(int) 
    {"other" => int } 
    end 

    def attribs_caller 
    attribs 
    end 

    def attribs 
    {"this" => 1 } 
    end 

end 

a1 = Example.new 

puts a1.attribs_caller #=> this1 
puts a1.to_something #=> other1 
puts a1.attribs_caller #=> this1 

cevap

2

fazladan bir yöntem yaratmadan, bunu yapmak için başka bir yolu da, aşağıdaki gibi şudur:

class Foo 
    def bar 
    :old_method 
    end 
end 

Foo.new.foo # => :old_method 

$old_method = Foo.new.method(:bar) 

class Foo 
    def bar 
    :new_method 
    end 
end 

Foo.new.foo # => :new_method 

class Foo 
    define_method($old_method.name, &$old_method) 
end 

Foo.new.foo # => :old_method 

Bunun bir takma yöntemi kullanarak daha iyi olduğunu düşünüyorum . Ruby'de de yöntemler, nesnelerdir. Nesnenin (yöntem) sınıfla ilişkisini tahrip etmeden önce sadece nesnenin referansını alıyorum. Aynı yöntemi ekledikten sonra. Yöntemi sınıftan kaldırmak için undef anahtar sözcüğünü kullanırsanız, aynı zamanda çalışır. Kötü olan nokta, yöntemin referansını almak için sınıfın bir nesnesine sahip olmanız gerektiğidir.

7
class String 
    alias orig_reverse reverse 
    def reverse(n) 
    'fooled you. '*n 
    end 
end 

puts "ab".reverse(2) 
#=> fooled you fooled you 

# clean up: 
class String 
    alias reverse orig_reverse 
    remove_method(:orig_reverse) 
end 

puts "ab".reverse #=> ba 
+0

güzel, bununla ilgili bir sorun, yeni yöntemin dinamik olması ve bazı parametreler gerektirmesidir. Ancak bu yöntemi dinamik olarak tanımlayabilirim. Örneği yansıtacak şekilde güncelledim. – stellard

+0

Doğru parametre siparişi, "alias alias_name original_name" gibi görünüyor, başka yoldan değil ... – vemv

İlgili konular