Ruby 使用“each”检查所有值是否相同

Ruby 使用“each”检查所有值是否相同,ruby,arrays,Ruby,Arrays,我试图评估每个空格值是否等于“X”或“O”。我可以用每一个来做这件事吗?有更好的办法吗 if @spaces.each {|x| x=="O" || x=="X"} @winner = true puts "It's a tie!" break end 预计到达时间:all?似乎也不起作用。我在引用带有块的行时遇到此错误: tictac.rb:47: syntax error, unexpected '|', expecting '}' {|x| x==

我试图评估每个空格值是否等于
“X”
“O”
。我可以用
每一个
来做这件事吗?有更好的办法吗

if @spaces.each {|x| x=="O" || x=="X"}
    @winner = true
    puts "It's a tie!"
    break
end
预计到达时间:
all?
似乎也不起作用。我在引用带有块的行时遇到此错误:

tictac.rb:47: syntax error, unexpected '|', expecting '}'
        {|x| x=="O" || x=="X"}
          ^
tictac.rb:47: syntax error, unexpected '}', expecting keyword_end
这是我正在研究的整个Tictatoe:

class Board
def initialize
    @spaces = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    self.print_board
    @winner = false
    @turn = "X"
end

def print_board 
    puts
    puts "    " + @spaces[0].to_s + " " + @spaces[1].to_s + " " + @spaces[2].to_s
    puts "    " + @spaces[3].to_s + " " + @spaces[4].to_s + " " + @spaces[5].to_s
    puts "    " + @spaces[6].to_s + " " + @spaces[7].to_s + " " + @spaces[8].to_s
    puts
end

def mark(turn, move)
   space = @spaces.index(move) 
   @spaces[space] = turn
   self.print_board
end

def play
      while @winner == false
    puts "where would you like to put your #{@turn}?"
    move = gets.chomp.to_i
    self.mark(@turn, move)
    if 
      @spaces[0] == @turn  && @spaces[1] == @turn && @spaces[2] == @turn ||
      @spaces[3] == @turn && @spaces[4] == @turn && @spaces[5] == @turn ||
      @spaces[6] == @turn && @spaces[7] == @turn && @spaces[8] == @turn ||
      @spaces[0] == @turn && @spaces[3] == @turn && @spaces[6] == @turn ||
      @spaces[1] == @turn && @spaces[4] == @turn && @spaces[7] == @turn ||
       @spaces[2] == @turn && @spaces[5] == @turn && @spaces[8] == @turn ||
       @spaces[0] == @turn && @spaces[4] == @turn && @spaces[8] == @turn ||
        @spaces[2] == @turn && @spaces[4] == @turn && @spaces[6] == @turn 

        @winner = true
        puts "#{@turn} is the winner!"
        break
    elsif @spaces.all? 
        {|x| x=="O" || x=="X"}
        @winner = true
        puts "It's a tie!"
        break
    else
        @turn == "X"? @turn = "O" : @turn = "X"
    end
    end
    end
end

game = Board.new 
game.play

我标记了一个有效的答案,我猜
all?
比我的
每个
都好,但我仍然好奇为什么将它改为
all?
似乎不起作用。

如果

(@spaces - ["O", "X"]).empty?
这是真的

@spaces = ["O", "X", "X", "O"]
(@spaces - ["O", "X"]).empty?
  #=> true

@spaces = ["O", "X", "X", "O", "cat"]
(@spaces - ["O", "X"]).empty?
  #=> false
链式数组#Uniq和数组#大小 将您的检查重构为一个方法,该方法接受一个框条目数组(例如“X”或“O”),或者一个包含这样一个数组的变量。如果数组中的所有字母都相同,则该方法将返回true,因为只有一个唯一字符。例如:

def check_spaces letters
  true if letters.uniq.size == 1
end

check_spaces %w[X X X] #=> true
check_spaces %w[O O O] #=> true
check_spaces %w[O X O] #=> nil
如果这样做,您甚至可以将#check_空格的结果直接分配给@winner,如下所示:

@winner = check_spaces %w[X X X]
#=> true

@winner = check_spaces %w[X O X]
#=> nil

不能在方法调用与其块之间放置换行符。这使Ruby认为您在调用方法时没有块并定义散列。

如果@spaces.all?{x | x==“O”| | x==“x”}
@spaces.all?{space |%w.include?space}
all?
工作正常:
[“O”、“x”、“x”、“x”、“O”].all?{| x | x==“O”| x==“x”}=>true
。不要在
all?
及其块之间换行。Ruby认为你在调用
all?
而没有一个块,并在下一行定义了一个散列;如果人们要否决问题,特别是来自新来者的问题,请在评论部分给出一些理由,以便他们将来可以改进他们的问题!我没有投反对票,但我明白为什么。“这个问题模棱两可。”萨瓦,请你开导我。我遗漏了什么样的解释?我对这个问题发表了评论。我明白了,你的解释与题目不符。谢谢我猜有人认为我应该回答Y(标题),而不是X(第一句话)。这是一个非常有用的答案,解决了我犯的根本性错误。
@spaces.all? { |x| x=="O" || x=="X" }