【问题标题】:Owerwrite Parent class variable through its Subclass通过其子类覆盖父类变量
【发布时间】:2014-08-31 11:04:46
【问题描述】:

父类:

account.rb

class Account
    attr_reader :owner, :interest
    attr_accessor :funds

    def initialize(args)
        @funds = args[:funds]
        @owner = args[:owner]
        @interest = 0.01
    end
end

saving_account.rb

class SavingAccount < Account
    attr_reader :interest
    def initialize(args)
        @interest = 0.05
        super(args)
    end
end

当我跑步时

saving_acc = SavingAccount.new(funds: 10000, owner: "Jack")
assert_equal(0.05, saving_acc.interest)

我明白了:

NoMethodError: 未定义方法interests' for #<SavingAccount:0x007fa711853828> tests/saving_account_test.rb:13:intest_interests'

我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing testing


    【解决方案1】:

    更改分配前调用super的顺序。

    class SavingAccount < Account
        attr_reader :interest
        def initialize(args)
            super(args)
            @interest = 0.05
        end
    end
    

    顺便说一句,这是一个导致错误的错字。

    assert_equal(0.05, saving_acc.interests)
                                          ^
    

    除此之外,@interest 不是类变量,而是实例变量。

    【讨论】:

    • 你说得对,除了错别字,一切都通过移动 super(args) 解决了
    【解决方案2】:

    去掉结尾的's'

     saving_acc = SavingAccount.new(funds: 10000, owner: "Jack")
     assert_equal(0.05, saving_acc.interest)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多