2015-10-05 32 views
0

我有一類Foo:動態添加語句的方法

class Foo 

    def a 
     "something" if true 
    end 

end 

我想要一個add_statement方法,將新語句添加到方法,保持舊的實現。可能嗎?

我想要做這樣的事情:

foo = Foo.new 
foo.extend_method(:a, &block) 

所以現在我a方法的來源應該是這樣的:

def a 
     "something" if true 
     &block 
    end 

其中&block是我作爲參數傳入的代碼extend_method

+0

'define_method(:add_statement,instance_method(:a))' –

+1

看來你想創建一個新方法,它包含'a'中的語句以及其他語句。你是這個意思嗎?請編輯並添加示例。 (標題中的「動態」拼寫錯誤。) –

+0

我編輯它,檢查它 – Alan

回答

1

您想使用alias_method_chainModule#prepend

網上有很多關於它們的教程/文檔,例如「AVOIDING ALIAS_METHOD_CHAIN IN RUBY」或「Module.prepend: a super story」。

對於您的具體示例(當您想在課堂外擴展功能時),您必須使用alias_method_chain,將其添加到新模塊中,並使用Foo.send包含在原始類中。

您可以在「When to use alias_method_chain」中找到更多詳細信息和示例。

+0

'Module#prepend'是我用於類似情況的一個很好的解決方案,我需要改變'require'和'require_relative'的行爲。此外,不要「這個或這個」,提供可用的錨文本,讓人們能夠快速,輕鬆地看到鏈接將採取他們的位置,而不必實際點擊它看。 –

0

下面是一個面向方面的例子:

require 'aspector' 

class Foo 
    def a 
    puts "in Foo.a" 
    end 
end 

aspect = Aspector do 
    before :a do 
    puts 'this should print first' 
    end 

    after :a do |result_of_a| 
    puts 'this should print last' 
    end 
end 

puts "\n\nplain instance" 
foo = Foo.new 
foo.a 

puts "\n\napply to an instance" 
aspect.apply(foo) 
foo.a 

puts "\n\napply to all instances of Foo" 
aspect.apply(Foo) 
Foo.new.a 

你需要 '寶石安裝aspector'。