Ruby中的康威生命游戏

3

我正在使用Ruby制作康威生命游戏,这是我的cell_spec.rb文件。第10行出现错误/失败,具体如下:

expect(GameOfLife::Cell.new_dead_cell).to be_dead 

我有另一个文件cell.rb,其中定义了类cell。如何在这个文件中实现自定义谓词匹配器?

require 'spec_helper'

describe GameOfLife::Cell do 
  def build_neighbours(live_count)
    [GameOfLife::Cell.new_live_cell] * live_count +
       [GameOfLife::Cell.new_dead_cell] * (8 - live_count)
  end
  context "factory" do
    it "can be dead" do
      expect(GameOfLife::Cell.new_dead_cell).to be_dead
    end

    it "can be alive" do
      expect(GameOfLife::Cell.new_live_cell).to be_alive
    end
  end

  context "live cell generation rules" do
    let(:cell) { GameOfLife::Cell.new_live_cell }

    [0, 1].each do |i|
      it "dies when there are #{i} live neighbours" do
        expect(cell.next_generation(build_neighbours(i))).to be_dead
      end
    end

    [2, 3].each do |i|
      it "lives when there are #{i} live neighbours" do
        expect(cell.next_generation(build_neighbours(i))).to be_alive
      end
    end

    (4..8).each do |i|
      it "dead when there are #{i} live neighbours" do
        expect(cell.next_generation(build_neighbours(i))).to be_dead
      end
    end
  end

  context "dead cell generation rules" do
    let(:cell) { GameOfLife::Cell.new_dead_cell }

    (0..2).each do |i|
      it "dies when there are #{i} live neighbours" do
        expect(cell.next_generation(build_neighbours(i))).to be_dead
      end
    end

    [3].each do |i|
      it "lives when there are #{i} live neighbours" do
        expect(cell.next_generation(build_neighbours(i))).to be_alive
      end
    end

    (4..8).each do |i|
      it "dead when there are #{i} live neighbours" do
        expect(cell.next_generation(build_neighbours(i))).to be_dead
      end
    end
  end
end

这是我的cell.rb文件,其中包含cell类..我想知道dead?和alive?方法的代码实现。请帮忙解决

class GameOfLife::Cell
  ALIVE = "alive"
  DEAD = "dead"

 # lost implementation
  def self.new_dead_cell
     return DEAD
  end

  def self.new_live_cell
    return ALIVE
  end

  def dead?

  end

  def alive?

  end

 end

请在您的问题中添加完整的错误信息。 - Patrick Oscity
它基本上告诉你代码有什么问题。为了使 be_dead 匹配器起作用,您需要在 GameOfLife::Cell 类中实现 dead? 方法。 - Patrick Oscity
new_dead_cell方法应该返回什么?它应该返回实例,所以最后一行应该是“self”,除非方法的最后一条语句已经返回了实例。 - Patrick Oscity
如果您想要获得良好的答案,您需要尽可能地让读者快速获取所有必要的信息。如果您想要粘贴更长的文本和有用的信息供其他读者使用,请编辑您的帖子。 - Patrick Oscity
请将您的单元格类添加到原始问题中,您可以进行编辑。 - Patrick Oscity
显示剩余6条评论
1个回答

0
这是一种显而易见的方法。 你只需创建一个新的Cell实例并存储其状态(如:dead或alive)。 然后,dead?和alive?方法只需检查该状态即可。
 class Cell
  ALIVE = :alive
  DEAD = :dead

  def self.new_dead_cell
     new(DEAD)
  end

  def self.new_live_cell
    new(ALIVE)
  end

  def initialize state
    @state = state
  end
  attr_reader :state

  def dead?
    state == DEAD
  end

  def alive?
    state == ALIVE
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接