【问题标题】:Is there a way to avoid definition of a method with a certain name?有没有办法避免定义具有特定名称的方法?
【发布时间】:2013-05-14 22:47:44
【问题描述】:

有没有办法避免(尝试时引发错误)定义具有特定名称的方法,例如Foo#bar? (一个用例是 Foo#bar 已经定义,我想避免该方法被覆盖,但这与问题无关。)我假设如下:

class Foo
  prohibit_definition :bar
end

...
# Later in some code

class Foo
  def bar
    ...
  end
end
# => Error: `Foo#bar' cannot be defined

【问题讨论】:

  • 我赌“做不到”。
  • @millimoose 我会接受这个赌注。
  • @ShawnBalestracci 你将不得不用十个代表点而不是金钱来凑合。

标签: ruby methods


【解决方案1】:
class Class
  def method_added(method_name)
    raise "So sad, you can't add" if method_name == :bad
  end
end

class Foo
  def bad
    puts "Oh yeah!"
  end
end

#irb> RuntimeError: So sad, you can't add
#   from (irb):3:in `method_added'
#   from (irb):7

【讨论】:

  • 您提出了错误,但实际上添加了该方法。还是我弄错了?
  • @emrenevayeshirazi 我能够在 1.8.7 中从 IRB 调用 Foo.new.bad,因此在某些情况下它确实会被添加。这取决于你想有多严厉,如果你真的想造成惩罚,你可以用 undef_method 代替。
【解决方案2】:

也许您可以在Module 类的method_added() 中捕获回调并检查方法名称,如果添加的方法不符合您的条件,则删除它。然后你可以提出一个错误。

不是你想要的,但我认为足够接近。

class Class
  def method_added(method_name)
    if method_name == :bar
        remove_method :bar
        puts "#{method_name} cannot be added to #{self}"
  end
end

【讨论】:

  • 谢谢。我想你明白了。 Shawn Balesstracci 给出了实现。
猜你喜欢
  • 2011-09-13
  • 2021-10-06
  • 2019-09-07
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多