下面的代码工作,但我不明白为什么。我有两个文件。第一个是一个名为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.new
和ActiveMarket::Walmart::Order.new
。为了做到这一点,我必须像上面看到的那样第二次定义类ActiveMarket::Walmart
,并将Order
类放在里面。这和预期的一样工作,但我不明白为什么我能够成功地调用所有这三个函数。
ActiveMarket::Walmart.new.test_one
ActiveMarket::Walmart.new.test_two
ActiveMarket::Walmart::Order.new.test_all
型
那么,问题是为什么这样做?为什么我可以在同一个类中调用test_one
和test_two
函数,而这两个类都是在两个完全不同的文件中定义的?我希望其中一个ActiveMarket::Walmart
类被完全覆盖。这有什么缺点吗?或者我应该改变我的实现吗?
先谢了。
2条答案
按热度按时间z31licg01#
Ruby允许重新打开现有的类并向其添加额外的方法或重写现有的方法。
在您的示例中,实际上只有一个
ActiveMarket::Walmart
类定义了两个示例方法。试试这个:
字符串
3df52oht2#
为了解释,让我们假设第一个代码块首先加载,然后是第二个代码块。
第一个代码块使用
test_one
方法定义ActiveMarket::Walmart
类。第二个代码块重新打开该类并将test_two
方法添加到该类。此行为在Ruby文档中有记录。一般来说,最好将
ActiveMarket::Walmart
的大部分方法定义在active_market/walmart.rb
文件中。这样,当您搜索特定的定义时,您就知道该在哪里查找。例如,如果ActiveMarket::Walmart
的方法test_one
在foo/bar.rb
中定义,则查找起来并不直观。如果你有很好的理由在另一个文件中定义
ActiveMarket::Walmart
的方法,请随意这样做。最后,它仍然是你的项目,你应该决定哪些代码属于同一个文件。