首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >leap.rb找不到模误差

leap.rb找不到模误差
EN

Stack Overflow用户
提问于 2014-03-30 22:42:06
回答 2查看 139关注 0票数 1

想知道为什么我不能打电话给.modulo。我觉得好像我必须在课堂上给数学打电话,但我不确定是这样的。

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

错误:

代码语言:javascript
运行
复制
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'

这是我的密码:

代码语言:javascript
运行
复制
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

这就是我所面临的考验:

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-30 23:04:27

这对我来说很管用:

代码语言:javascript
运行
复制
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

然后你用:

代码语言:javascript
运行
复制
y = Year.new(1995)
y.leap?

或者,您可以像这样使用它:

代码语言:javascript
运行
复制
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类了。

代码语言:javascript
运行
复制
Year.leap?(1995)
=> false
票数 0
EN

Stack Overflow用户

发布于 2014-03-30 23:01:08

divbyfour方法中,对不存在的theyear变量调用modulo

这里有一个代码可以解决你的问题。

代码语言:javascript
运行
复制
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

示例:

代码语言:javascript
运行
复制
>> 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及其成语的一个很好的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22750873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档