在Ruby中两次定义同一个类

jdzmm42g  于 11个月前  发布在  Ruby
关注(0)|答案(2)|浏览(94)

下面的代码工作,但我不明白为什么。我有两个文件。第一个是一个名为walmart.rb的类,位于active_market/walmart.rb。下面是类定义:

module ActiveMarket
    class Walmart
        def test_one
            puts "test one"
        end
    end
end

字符串
对于我的Walmart类,我有沃尔玛API的“API实现”,如订单、履行、报告等。因此,我为我在active_market/walmart/order.rb的第一个API实现创建了一个文件夹和另一个类。
下面是Order类的定义:

class ActiveMarket::Walmart
  def test_two
    puts "test two"
  end

  class Order < ActiveMarket::Walmart
    def test_all
      test_two
      test_one
    end
  end

end


我希望能够调用ActiveMarket::Walmart.newActiveMarket::Walmart::Order.new。为了做到这一点,我必须像上面看到的那样第二次定义类ActiveMarket::Walmart,并将Order类放在里面。这和预期的一样工作,但我不明白为什么我能够成功地调用所有这三个函数。

ActiveMarket::Walmart.new.test_one
ActiveMarket::Walmart.new.test_two
ActiveMarket::Walmart::Order.new.test_all


那么,问题是为什么这样做?为什么我可以在同一个类中调用test_onetest_two函数,而这两个类都是在两个完全不同的文件中定义的?我希望其中一个ActiveMarket::Walmart类被完全覆盖。这有什么缺点吗?或者我应该改变我的实现吗?
先谢了。

z31licg0

z31licg01#

Ruby允许重新打开现有的类并向其添加额外的方法或重写现有的方法。
在您的示例中,实际上只有一个ActiveMarket::Walmart类定义了两个示例方法。
试试这个:

walmart = ActiveMarket::Walmart.new
walmart.test_one
#=> test one
walmart.test_two
#> test two

字符串

3df52oht

3df52oht2#

为了解释,让我们假设第一个代码块首先加载,然后是第二个代码块。
第一个代码块使用test_one方法定义ActiveMarket::Walmart类。第二个代码块重新打开该类并将test_two方法添加到该类。此行为在Ruby文档中有记录。
一般来说,最好将ActiveMarket::Walmart的大部分方法定义在active_market/walmart.rb文件中。这样,当您搜索特定的定义时,您就知道该在哪里查找。例如,如果ActiveMarket::Walmart的方法test_onefoo/bar.rb中定义,则查找起来并不直观。
如果你有很好的理由在另一个文件中定义ActiveMarket::Walmart的方法,请随意这样做。最后,它仍然是你的项目,你应该决定哪些代码属于同一个文件。

相关问题