防止方法被重新定义

时间:2012-01-31 18:05:53

标签: ruby

所以,我需要在类中保护一个方法来防止重新定义。我不确定如何解释它,所以这里是代码:

module Foo
    def bar
        p "lol"
    end
end

现在,这是原始的Foo#bar方法,我需要喜欢一个常量。所以,我确实提出了一个解决方案。那是将方法保存在常量中并检测有人尝试更改它时,只需从该常量重新加载它(它是一个Proc对象):

module Foo
        Original_bar = Proc.new { p "lol" }

        def bar
            Original_bar.call
        end

        def self.method_added(method_name)
            if method_name == :bar
                def Foo::bar
                    Original_bar.call
                end
            end
        end
end

但这并非完全安全,因为曾经可以使用我所做的相同“技巧”绕过method_added而我并不是真的喜欢这个,因为它不是非常红宝石 - 等。


测试

正常测试:

module Foo
    def bar
        p "lmao"
    end
end

Foo::bar # => "lol"

另一个使用技巧的测试

def Foo::bar
    p "rofl"
end

Foo::bar # => "rofl"

TL;博士

如何在Ruby中创建一个方法“无法确定”(如果这甚至是一个单词)

2 个答案:

答案 0 :(得分:1)

如果你冻结了应该阻止添加方法的模块。

请注意,c扩展名可以解冻变量(例如,请参阅evil.rb

答案 1 :(得分:0)

您可以通过启用警告让您的代码警告您方法已被覆盖:

$VERBOSE = true

module Foo
  def self.bar
    p "lmao"
  end
end

def Foo::bar
    p "rofl"
end

(irb):9: warning: method redefined; discarding old bar

在发出警告时,可能会(而不是practical)提出异常。

但是,如果您首先取消定义Foo.bar,则不会警告您。