两个Ruby gem使用相同的命名空间

时间:2017-12-11 23:48:23

标签: ruby-on-rails ruby namespaces

我正在创建两个包装相同API的gem。一个是包含API端点的vanilla客户端库,第二个是与第三方API集成,并在第一个上提供另一层抽象。他们没有任何重叠的方法。

第二个扩展第一个命名空间是否可以接受?

例如:

# vanilla client lib
module Foo
  class Bar
    def do_bar
      puts "Bar!"
    end
  end
end

# more complex client lib
module Foo
  class Baz
    def do_baz
      puts "Baz!"
    end
  end
end

基于this question,看起来AWS就是这样做的。是否存在可以接受的情况以及不存在的情况?

1 个答案:

答案 0 :(得分:1)

这似乎是构建宝石的完全可接受的方式。在您的代码示例中,Foo::BarFoo::Baz将是同一名称空间中的两个完全不同的类,并且它们不会相互冲突。即使您在两个类中使用相同的方法名称,也是如此:

module Foo
  class Bar
    def do_thing
      puts "Bar!"
    end
  end
end

module Foo
  class Baz
    def do_thing
      puts "Baz!"
    end
  end
end

在此修改示例中,Foo::Bar#do_thing将输出"Bar!"Foo::Baz#do_thing将输出"Baz!",因为它们是不同类中的单独方法。这种方法允许您为Foo::Baz个对象交换Foo::Bar个对象以改变行为,因为它们具有相同的接口。

如果您希望第三方API gem扩展您的vanilla API gem的功能,您可能需要考虑调整使用继承的方法。