【问题标题】:RSpec: Undefined method 'max' for 4:fixnumRSpec:4:fixnum的未定义方法'max'
【发布时间】:2014-12-25 16:45:34
【问题描述】:

规格:

# spec/row_spec.rb
require "spec_helper"

module Mastermind
  describe Row do

    context "#initialize" do
      it "has four elements by default" do
        row = Row.new
        expect(row.values.size).to eq 4
      end

      it "can only go up to 6" do
        row = Row.new
        expect(row.values.max).to be <= 6
      end
    end

  end
end

代码:

# lib/mastermind/row.rb
module Mastermind
  class Row
    attr_accessor :values
    def initialize (values=random_row)
      @values = values
    end

    def random_row
      4.times {random||=[] << rand(1..6)}
    end

  end
end

Row 应该是主谋游戏的一行,有四个介于 1 和 6 之间的随机值,并且这个测试应该确保它正常运行。看起来 values 返回的是 int 而不是数组。为什么?

我将如何自行解决此问题?我试图通过添加一些简单的东西来准确地查看值发生了什么

row = Row.new
puts row.values

到我的 row.rb,但我只是得到一个未初始化的常量错误。为什么这不起作用?

【问题讨论】:

    标签: ruby oop rspec


    【解决方案1】:

    这是你的问题 (random_row):

    [1] pry(main)> 4.times {random||=[] << rand(1..6)}
    => 4
    

    times 返回值。你想要这样的东西:

    [2] pry(main)> 4.times.map { rand(1..6) }
    => [6, 5, 3, 6]
    

    您的另一个问题是因为您没有指定模块,Row 不存在,Mastermind::Row 存在。

    [4] pry(main)> row = Mastermind::Row.new
    => #<Mastermind::Row:0x00000101c593e0 @values=4>
    [5] pry(main)> row.values
    => 4
    

    【讨论】:

      【解决方案2】:

      你的问题是#random_row会返回4Fixnum#times的返回值是self),这意味着当你初始化Row时,@values被设置为4

      你可能想要这样的东西:

      def random_row
        Array.new(4) { rand(1..6) }
      end
      

      【讨论】:

      • 也可以是:(1..6).to_a.sample(4)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多