2014-03-27 112 views
0

我有以下代碼:問題與創建DSL語法

module A 
    def self.included(base) 
    base.extend(ClassMethods) 
    end 
    def foo 
    a = bar 
    puts a 
    end 
    def bar(str="qwe") 
    str 
    end 

    module ClassMethods 
    end 
end 

class B 
    include A 
    def bar(str="rty") 
    str 
    end 
end 

B.new.foo #=> "rty" 

祝類B看起來像這樣:

class B 
    include A 
    bar "rty" 
end 

B.new.foo #=> rty 

class B 
    include A 
    HelperOptions.bar "rty" # HelperOptions class should be in module A 
end 

B.new.foo #=> rty 

我試着用define_methodclass_evalinitialize。如何實現語法bar 'rty'HelperOptions.bar 'rty'以及模塊A需要做什麼?

回答

2

如果我得到你的問題正確,你要定義一個類的方法A.bar定義的實例方法B#bar返回它的參數,你可以做這樣的:

module A 
    def self.included(base) 
    base.extend(ClassMethods) 
    end 
    def foo 
    puts bar 
    end 

    module ClassMethods 
    def bar(str) 
     define_method(:bar) { str } 
    end 
    end 
end 

class B 
    include A 
    bar 'rty' 
end 

B.new.bar 
# => "rty" 

B.new.foo 
# Output: rty 
+0

非常感謝,這是我的」尋找。 HelperOptions.bar的第二個變體呢?我如何爲模塊A中的類HelperOptions定義'bar'方法以使用語法類B;包括A; HelperOptions.bar'rty'; end –

+0

如果你想實現調用'HelperOptions.bar',你必須將'self'(即類'B')傳遞給'HelperOptions.bar'方法,這樣你可以調用'B.send(:define_method,:酒吧)做...'。我不會推薦它。 – toro2k