如何使用数组方法作为 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
【问题讨论】:
<<some more code>>
应该在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?(&method(:my_check))
。或者使用 lambda 而不是方法并说check_array.any?(&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
Ruby on Rails:未定义的方法,检查boolean if true语句