2014-03-30 21 views
1

想知道是否有人可以看到爲什麼我不能調用.modulo。我覺得就像我必須在課堂上稱Math一樣,但我不確定這是什麼情況。leap.rb找不到模誤差

的git:https://github.com/jbasalone/ja/tree/master/ruby/exercism.io/leap

錯誤:

test_leap_year(YearTest): 
    NoMethodError: undefined method `modulo' for nil:NilClass 
    /Users/jennyb/ja/ja/ruby/exercism.io/leap/year.rb:26:in `divbyfour?' 
    /Users/jennyb/ja/ja/ruby/exercism.io/leap/year.rb:17:in `leap?' 
    leap_test.rb:6:in `test_leap_year' 

這是我的代碼:

class Year 

    def initialize(theyear) 
     @theyear = theyear 
    end 
class << self 

    attr_reader :theyear 

    def initialize(theyear) 
     @theyear = theyear 
    end 

    def leap?(theyear) 
     divbyfour? && !acentury? || bcentury? 
    end 
    #private 

    def acentury? 
     theyear.modulo 100 == 0 
    end 

    def divbyfour? 
     theyear.modulo 4 == 0 
    end 

    def bcentury? 
     theyear.modulo 400 == 0 
    end 
    end 
    end 

這是我對它運行測試:

require 'minitest/autorun' 
require_relative 'year' 

class YearTest < MiniTest::Unit::TestCase 
    def test_leap_year 
    assert Year.leap?(1996) 
    end 

    def test_non_leap_year 
    skip 
    refute Year.leap?(1997) 
    end 

    def test_non_leap_even_year 
    skip 
    refute Year.leap?(1998) 
    end 

    def test_century 
    skip 
    refute Year.leap?(1900) 
    end 

    def test_fourth_century 
    skip 
    assert Year.leap?(2400) 
    end 
end 
+0

你不初始化年等級: Year.new(1996).leap? 你也不需要跳躍的參數?方法: def leap?(theyear) divbyfour? && !一個世紀? || bcentury? 結束 應改爲 def leap? divbyfour? && !一個世紀? || bcentury? 結束 – Giannis

+0

如果我刪除了我得到的論據; test_leap_year(YearTest): ArgumentError:參數數量錯誤(1代表0) /Users/jennyb/code/training/ruby/leap/year.rb:21:in'leap?' leap_test.rb:6:'test_leap_year' –

+0

對不起,我的評論不太清楚,我在下面發佈了一個答案,這對我很有用。希望能幫助到你! – Giannis

回答

0

這個工作對我來說:

class Year 

    attr_accessor :theyear 

    def initialize(theyear) 
     @theyear = theyear 
    end 

    def leap? 
     divbyfour? && !acentury? || bcentury? 
    end 
    #private 

    def acentury? 
     theyear.modulo(100) == 0 
    end 

    def divbyfour? 
     theyear.modulo(4) == 0 
    end 

    def bcentury? 
     theyear.modulo(400) == 0 
    end 
end 

然後調用它:

y = Year.new(1995) 
y.leap? 

或者您可以使用它像這樣:

class Year 

    def self.leap?(year) 
     @theyear = year 
     divbyfour? && !acentury? || bcentury? 
    end 

    def self.theyear 
     @theyear 
    end 
    #private 

    def self.acentury? 
     theyear.modulo(100) == 0 
    end 

    def self.divbyfour? 
     theyear.modulo(4) == 0 
    end 

    def self.bcentury? 
     theyear.modulo(400) == 0 
    end 
end 

然後你不」不需要初始化年級。

Year.leap?(1995) 
=> false 
+0

你是否認爲這將工作。多數民衆贊成我最初是如何,但測試期望類方法 –

+0

編輯我的答案:-) – Giannis

+0

不錯。它帶來了一些新的,但進步。 1)錯誤: test_leap_year(YearTest): TypeError:false不能被強制轉換爲Fixnum /Users/jennyb/code/training/ruby/leap/year.rb:23:in'modulo' /Users/jennyb /code/training/ruby/leap/year.rb:23:in'divbyfour?' /Users/jennyb/code/training/ruby/leap/year.rb:10:in'leap?' leap_test.rb:6:'test_leap_year」 –

0

divbyfour方法你叫modulotheyear變量不存在。

這是修復您的問題的代碼。

class Year 
    attr_reader :theyear 

    def initialize(theyear) 
    @theyear = theyear 
    end 

    def leap? 
    divbyfour? && !acentury? || bcentury? 
    end 

    def acentury? 
    theyear.modulo(100) == 0 
    end 

    def divbyfour? 
    theyear.modulo(4) == 0 
    end 

    def bcentury? 
    theyear.modulo(400) == 0 
    end 
end 

例子:

>> year = Year.new 2014 
=> #<Year:0xb8eb15b4 @theyear=2014> 
>> year.leap? 
=> false 

我做了什麼:

如果您有時間,請查看Ruby Koans - 這是學習Ruby及其習語的好方法。

+0

這不會工作,因爲測試期望類方法,而不是實例方法。 –

+0

你自己寫了這個測試嗎?恕我直言,從OOP的角度來看,它更適合作爲實例方法而不是類方法。 –

+0

我沒有,它對我來說沒有多大意義 –