2016-11-15 48 views
-1

如何在类和混合模块中使用method_missingruby​​ method_missing class and module中的用法

module Bar 
    def method_missing(name, *args) 
    p 'Bar' if name =~ /bar/ 
    end 
end 

class Foo 
    include Bar 

    def method_missing(name, *args) 
    p 'Foo' if name =~ /foo/ 
    end 
end 

a = Foo.new 
a.foofoo => "Foo" 
a.barbar => nil 

回答

5

使用super

module Bar 
    def method_missing(name, *args) 
    p 'Bar' if name =~ /bar/ 
    end 
end 

class Foo 
    include Bar 

    def method_missing(name, *args) 
    p 'Foo' if name =~ /foo/ 
    super # ⇐ HERE 
    end 
end 

a = Foo.new 
a.foofoo => "Foo" 
a.barbar => "Bar" 

正如评论所指出的@ndn,人们可能会谨慎处理不同的结果。 super可能进行调整使用,当且仅当Foo#method_missing执行没有成功:确实

def method_missing(name, *args) 
    case name 
    when /foo/ then p 'Foo' 
    # ..... 
    else super # ⇐ HERE 
    end 
    end 
+0

@ndn,但构建一个强大的'案例when'内'method_missing'是有点出这个问题的范围。 – mudasobwa

+1

@ndn是的,我终于决定放弃一个关于答案的通知。谢谢。 – mudasobwa

相关问题