所以,我需要在类中保护一个方法来防止重新定义。我不确定如何解释它,所以这里是代码:
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"
如何在Ruby中创建一个方法“无法确定”(如果这甚至是一个单词)?
答案 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,则不会警告您。