如何在包含已具有相同名称方法的模块时引发错误

时间:2017-05-24 10:47:33

标签: ruby

假设:

module Foo
  def bar
    puts 'Foo Bar!'
  end
end

class Person
  def bar
    puts 'Person Bar!'
  end
end

class Person
  # I want this line to raise an error because Foo and Person has same-named methods that would break dependencies if ignored
  include Foo
end

Person.new.bar
# => Person Bar!

问题:

  • 从上面的代码中,我正在寻找替代includeextend的替代方法,除了在已经定义包含或扩展方法时会引发错误。
  • include!extend!吗?

用法:

  • 我正在编写一个小型gem,它将向Object类添加方法:

    class Object
      include MyGemName
    end
    

    ,我想首先确保Object类尚未定义同名方法。

尝试:

class Person
  duplicate_methods = self.instance_methods(false) & Foo.instance_methods(false)
  raise "#{self} already has methods: #{duplicate_methods}" unless duplicate_methods.empty?
  include Foo
end
  • 上面的工作,但因为这是我的第一个宝石,我觉得“命名”是一个“通常”的编程问题,也许只有一些“更简单”的方法。

注意:

  • 我需要覆盖Object类,因为我想跳过将self作为参数传递给所述方法。

  • 我可能在这里只是简单的遗漏,但我在互联网上的搜索没有给我带来任何有用的解决方案。也许那时候,我做错了什么?

1 个答案:

答案 0 :(得分:4)

如果确实想要这种行为,您可以考虑以下事项:

const HelloWorld = ({name}) => (
  <div>
    {`Hi ${name}`}
    <Helmet>
        <title>Who's Marco?</title>
    <Helmet>
  </div>
);

运行代码会得到以下结果:

  

在`included&#39;:Foo覆盖bar(RuntimeError)