代码之家  ›  专栏  ›  技术社区  ›  Cannon Moyer

在Ruby中定义同一类两次

  •  0
  • Cannon Moyer  · 技术社区  · 6 年前

    下面的代码可以工作,但我不明白为什么。我有两份文件。第一个是一个叫做 walmart.rb 位于 active_market/walmart.rb .以下是课程定义:

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

    为了我的 Walmart 类我有沃尔玛API的“API实现”,比如订单、履行、报告等。所以我为我的第一个API实现创建了一个文件夹和另一个类 active_market/walmart/order.rb .

    这是答案 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 第二次,如上图所示,将 顺序 在里面上课。这正如预期的那样工作,但我不明白为什么我能够成功地调用这三个函数。

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

    所以,问题是,为什么这样做有效?为什么我两个都能打电话 test_one test_two 在两个完全不同的文件中定义的同一类中的函数?我本以为 沃尔玛 类被完全覆盖。这有什么坏处吗?或者我应该改变我的实现吗?

    提前谢谢。

    0 回复  |  直到 6 年前
        1
  •  2
  •   spickermann    6 年前

    Ruby允许重新打开现有类并向其添加其他方法,或者重写现有方法。

    在你的例子中,实际上只有一个 ActiveMarket::Walmart 类定义两个实例方法。试试这个:

    walmart = ActiveMarket::Walmart.new
    walmart.test_one
    #=> test one
    walmart.test_two
    #> test two
    
        2
  •  1
  •   3limin4t0r    6 年前

    为了便于解释,我们假设先加载第一个代码块,然后加载第二个代码块。

    第一个代码块定义 ActiveMarket::Walmart 和老师一起上课 test_one 方法第二个代码块重新打开类并添加 test_two 方法将其应用到类中。这种行为记录在Ruby中 documentation .

    一般来说,最好是对 沃尔玛 active_market/walmart.rb 文件这样,当你搜索一个特定的定义时,你就知道该去哪里找了。如果方法 测试一 属于 沃尔玛 定义于 foo/bar.rb 例如,要找到它就不是直觉。

    如果你有充分的理由来定义 沃尔玛 在另一个文件中,请随意这样做。最后还是你的项目,你应该决定哪些代码属于同一个文件。

    推荐文章