1

codeschoolのruby-bitsコースから、これらのクラスがどのように機能するかを理解しようとしています。ゲームのコレクションを格納するGameクラスとコレクションクラスがあります。Library

class Game
  attr_accessor :name, :year, :system
  attr_reader :created_at

  def initialize(name, options={})
    self.name = name
    self.year = options[:year]
    self.system = options[:system]
    @created_at = Time.now
  end


  def ==(game)
    name == game.name && 
    system == game.system &&
    year == game.year
  end
end

ライブラリクラス:

class Library
  attr_accessor :games

  def initialize(*games)
    self.games = games
  end

  def has_game?(*games)
    for game in self.games
      return true if game == game
    end
    false
  end
end

今、私はいくつかのゲームを作成します:

contra = Game.new('Contra', {
  year: 1994,
  system: 'nintendo'
})

mario = Game.new('Mario', {
  year: 1996,
  system: 'SNES'
})

sonic = Game.new('Sonic', {
  year: 1993,
  system: 'SEGA'
})

新しいコレクションをインスタンス化します。

myCollection = Library.new(mario, sonic)

myCollection特定のゲームがこのメソッドを使用しているかどうかを調べようとするとhas_game?、常に次のようになります。true

puts myCollection.has_game?(contra) #=> returns **true**これがコレクションの一部として挿入されたことはありませんが。

私は何が間違っているのですか?

4

2 に答える 2

2
return true if game == game

この発言は問題になると思います。

それは常に真実です。

次のようなものが必要になる場合があります。

def has_game?(wanted)
  for game in self.games
    return true if game == wanted
  end
  false
end
于 2012-12-18T16:07:11.587 に答える
1

ここで間違っていることがいくつかあります。

  1. self.XXXXを使用してインスタンス変数を作成する代わりに@XXXX、値に直接アクセスし、 self を使用して実際に別のメソッド呼び出しを実行します。詳細については、こちらを参照してください:インスタンス変数: self vs @

  2. 言及game == gameされた他の人は常に を返すtrueため、すでに投稿された回答では、複数のゲームを渡すことはできませんhas_game?

正しく機能する私の変更は次のとおりです。

class Game
  attr_accessor :name, :year, :system
  attr_reader :created_at

  def initialize(name, options={})
    @name       = name
    @year       = options[:year]
    @system     = options[:system]
    @created_at = Time.now
  end


  def ==(game)
    @name == game.name && 
    @system == game.system &&
    @year == game.year
  end
end

class Library
  attr_accessor :games

  def initialize(*games)
    @games = games
  end

  # only returns true if this Library
  # has ALL of the games passed to has_game? 
  def has_game?(*_games)
    _games.each do |game|
      return false if not @games.include?(game)
    end

    return true
  end
end

contra = Game.new('Contra', {
  year: 1994,
  system: 'nintendo'
})

mario = Game.new('Mario', {
  year: 1996,
  system: 'SNES'
})

sonic = Game.new('Sonic', {
  year: 1993,
  system: 'SEGA'
})

myCollection = Library.new(mario, sonic)
puts "Collection has Contra? #{myCollection.has_game?(contra)}"
puts "Collection has Sonic and Mario #{myCollection.has_game?(sonic, mario)}"

出力:

Collection has Contra? false
Collection has Sonic and Mario true
于 2012-12-18T16:47:58.367 に答える