想知道为什么我不能打电话给.modulo。我觉得好像我必须在课堂上给数学打电话,但我不确定是这样的。
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
发布于 2014-03-30 23:04:27
这对我来说很管用:
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
然后就不需要初始化you类了。
Year.leap?(1995)
=> false
发布于 2014-03-30 23:01:08
在divbyfour
方法中,对不存在的theyear
变量调用modulo
。
这里有一个代码可以解决你的问题。
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
我所做的:
include Math
。方法,所以这里不需要它,反正你也不需要它-- Fixnum
方法。class << self
线。读完关于它所做的事情。而且,initialize
应该是一个实例方法,而不是类方法。这是Ruby中实例方法和类方法的区别上的一个很好的帖子。modulo
的调用中添加括号。theyear.modulo 100 == 0
相当于theyear.modulo(100 == 0)
,您真正想要的是theyear.modulo(100) == 0
。如果您有时间,请查看红宝石考恩 --这是学习Ruby及其成语的一个很好的方法。
https://stackoverflow.com/questions/22750873
复制相似问题