如何使用数组方法作为 Ruby 中 if 语句的条件

Posted

技术标签:

【中文标题】如何使用数组方法作为 Ruby 中 if 语句的条件【英文标题】:How to use an array method as condition for if statement in Ruby 【发布时间】:2022-01-05 09:33:10 【问题描述】:

我正在用 Ruby 构建一个井字游戏。为了确定是否有人赢得了比赛,我有一个二维数组 check_array,它包含您可以用来获胜的所有可能的集合。我想看看检查数组中的任何一个数组是否具有所有相同的元素。我的 javascript 大脑很难弄清楚如何在 Ruby 中做到这一点。我很困惑没有我的卷发来描绘这个街区。我理解这种语法:

if check_array.any? |row|row.uniq.count == 1
  @winner = @whos_turn
  winning
end 

但是,如果我需要为我的 any 使用多条逻辑线怎么办?逻辑。会不会是这个样子?

if check_array.any? do |row|
    row.uniq.count == 1
    <<some more code>>
  end
  @winner = @whos_turn
  winning
end 

【问题讨论】:

&lt;&lt;some more code&gt;&gt; 应该在any?do end 之外。 可以,但这取决于您想要实现的目标。如果传递给any? 的块返回true,则if 将为true。由于该块可以包含任意数量的代码(和逻辑),因此您可以在其中做任何您想做的事情。 【参考方案1】:

只需使用单独的变量。

match = check_array.any? do |row|
  row.uniq.count == 1
  <<some more code>>
end
if match 
  @winner = @whos_turn
  winning
end 

或者,甚至更好,

def my_check(row)
  row.uniq.count == 1
  <<some more code>>
end

if check_array.any?  |x| my_check(x) 
  @winner = @whos_turn
  winning
end

我不知道建议的嵌套do .. end 语法是否有效,但我不知道的事实表明它不是很直观,应该重构。

【讨论】:

或与第二次使用check_array.any?(&amp;method(:my_check))。或者使用 lambda 而不是方法并说check_array.any?(&amp;my_check)【参考方案2】:

无论你怎么做,你当然不必担心代码的效率。因此,我建议您专注于可读且易于测试的代码,也许是以下几行。

假设:

game = [[:X, :O, :X],
        [:O, :X, :O], 
        [:O, :X, :X]]

def winner(game)
  return :X if player_win?(game, :X)
  return :O if player_win?(game, :O)
  return :NO_WINNER
end
def player_win?(game, mark)
  row_win?(game, mark) || col_win?(game, mark) || diag_win?(game, mark)
end
def row_win?(game, mark)
  game.any?  |row| row == [mark, mark, mark] 
end
def col_win?(game, mark)
  row_win?(game.transpose, mark)
end
def diag_win?(game, mark)
  3.times.all?  |i| game[i][i] == mark  ||
  3.times.all?  |i| game[i,2-i] == mark  
end

对于上面定义的game

winner(game)
  #=> :X
game = [[:X, :O, :X],
        [:O, :O, :O], 
        [:X, :X, :_]]
winner(game)
  #=> :O
game = [[:X, :O, :X],
        [:O, :O, :X], 
        [:X, :X, :O]]
winner(game)
  #=> :NO_WINNER

【讨论】:

以上是关于如何使用数组方法作为 Ruby 中 if 语句的条件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ActiveRecord 准备语句中使 ruby​​ 数组成为 x、y、z

针对IF语句测试范围值数组的最佳方法

Ruby on Rails:未定义的方法,检查boolean if true语句

如何使 ruby​​ 案例语句使用等于 (==) 而不是三等号 (===)

如何在if条件语句中搜索char数组中的char

如何在 Ruby 中编写复杂的多行 if 条件?