3

カスタム クラスのメソッドを定義するということは、そのクラスto_sでメソッドを呼び出すと でputs指定された出力が返されることを意味すると考えましたto_s。しかし、このプログラムでは、 と書いた場合に、自分が切望する結果しか得られませんputs bingo_board.to_s。何が起こっている?

class BingoBoard < Array
  @@letters = %w[B I N G O]

  def initialize
    # populates an 5x5 array with numbers 1-100
    # to make this accessible across your methods within this class, I made
    # this an instance variable. @ = instance variable
    @bingo_board = Array.new(5) {Array.new(5)}
    @bingo_board.each_with_index do |column, i|
      rangemin = 15 * i + 1
      @bingo_board[i] = (rangemin..(rangemin+14)).to_a.sample(5)
    end
    @bingo_board[2][2] = "X" # the 'free space' in the middle
    @game_over = false
  end

  def game_over?
    @game_over
  end

  def generate_call
    ....
  end

  def compare_call(call)
    @bingo_board[@@letters.index(call[0])].include? call[1]
  end

  def react_to_call(call)
    ...
  end

  def check_board
    ...
  end

  def show_column(num)
    ...
  end

  def to_s
    result = ""
    0.upto(4) do |val|
      result += " " + @@letters[val] + " "
    end
    result += "\n\n"
    0.upto(4) do |row|
      0.upto(4) do |col|
        val = @bingo_board[col][row]
        result += " " if val.to_i < 10
        result += val.to_s + " "
      end
      result += "\n"
    end
    result
  end
end

my_board = BingoBoard.new
counter = 0
until my_board.game_over?
  puts my_board.to_s # renders the board in accordance with my to_s method
  call = my_board.generate_call
  counter += 1
  puts "\nThe call \# #{counter} is #{call[0]} #{call[1]}"
  my_board.react_to_call(call)
  gets.chomp
end
puts my_board  # renders bubkes (i.e., nothing)
puts "\n\n"
puts "Game over"
4

4 に答える 4

1

オブジェクトがArrayまたは に変換できる場合 (つまり、 を実装している場合to_ary) は、オブジェクトをputs呼び出さずに、オブジェクトを反復処理し、呼び出しによって内部の各オブジェクトを出力します。to_sto_s

見る:

puts [1, 2]
# 1
# 2

[1, 2].to_s
# => '[1, 2]'

これ実際には文書化されていますが、暗黙のうちに次のようになります。

配列引数で呼び出された場合、各要素を新しい行に書き込みます。

于 2014-10-19T19:06:52.433 に答える
0

Array#inspectcustom の代わりに method を実行しているようto_sです。alias_method :inspect, :to_s定義の終了直後に追加するto_sと役立ちます。

ただし、 でのみp動作putseach(&:inspect)ます。

于 2014-10-19T17:04:20.707 に答える