【问题标题】:Ruby - Populate and Array with returned method valuesRuby - 使用返回的方法值填充和数组
【发布时间】:2014-08-12 10:21:42
【问题描述】:

因此,假设我们有以下三个methods 检查网格以确定是否有获胜者,如果有则返回true

def win_diagonal?
  # Code here to check for diagonal win.
end

def win_horizontal?
  # Code here to check for horizontal win.
end

def win_vertical?
  # Code here to check for vertical win.
end

我想将每个方法的返回值推送到Array,而不是直接使用方法名称。这可能吗?

def game_status
  check_wins = [win_vertical?, win_diagonal?, win_horizontal?]
  if check_wins.uniq.length != 1 # When we don't have only false returns from methods
    return :game_over
  end
end

【问题讨论】:

  • 你的问题有点不清楚。您只是在问您发布的代码是否有效?我建议尝试一下,但我很确定它会。你在问别的吗?
  • 检查if win_vertical? || win_diagonal? || win_horizontal? 是一种让您的代码更短更清晰的方法——这样您就不需要数组或不太直接的测试。
  • 上面的代码无法正常工作,无法实现我想要实现的目标。此外,尝试您发布的代码“if win_vertical? || win_diagonal? || win_horizontal?”将始终返回:game_over 示例:irb(main):005:0> puts "hi" if 1 || 2 || 3 == 5 hi
  • 试试if false || false || true——假设你的方法返回truefalse。你不需要== 任何东西。

标签: ruby arrays function methods


【解决方案1】:

您正在寻找的东西确实可以在 ruby​​ 中使用。

def hello_world?
  "hello world!"
end

a = [hello_world?]

打印出来

=> [“你好世界!”]

希望对您有所帮助。 IRB 是你的朋友,当你想知道在 Ruby 中是否有可能时:-)

【讨论】:

  • 啊,是的,我想我应该多看看我的代码。那么它必须有另一个问题。谢谢!
  • 是的,您发布的代码在 Ruby 中有效。如果您仍然遇到此问题的问题,请更新您的问题,我们将能够提供进一步的帮助!
【解决方案2】:

更简单的方式(并且非常易读):

def game_status
  win_vertical? || win_diagonal? || win_horizontal?
end

例如,如果 win_vertical? 返回 true,则其他算法甚至都不需要运行。你马上回来。

或者,如果您需要知道用户以哪种方式获胜,我的意思是,如果您需要在所有方法运行后保留它们的结果,您可以使用哈希,例如:

{:vertical => win_vertical?, :diagonal => win_diagonal?, :horizontal => win_horizontal?}

此解决方案与数组解决方案一样,比上面的第一个解决方案更糟糕,因为它始终运行所有算法。如果它们很复杂,您可能会遇到问题。 =)

【讨论】:

  • 如果你想知道一个玩家是如何获胜的,你可能有三种方法分别返回:win_vertical:win_diagonal:win_horizontal(真实)或false等。或者,你可以写:(win_vertical? && :win_vertical) || (win_diagonal? && :diagonal) || (win_horizontal? && :horizontal),这将返回符号之一(真实)或false。请注意,对于某些游戏,例如井字游戏,这三种方法中的一种以上可能对单个游戏结果是正确的。
【解决方案3】:

当你真的想将所有返回值存储在一个数组中时,你可以这样做:

def game_status
  check_wins = [win_vertical?, win_diagonal?, win_horizontal?]

  return :game_over if check_wins.any?
end

为了可读性,我更喜欢:

def game_status
  return :game_over if win_vertical? || win_diagonal? || win_horizontal?
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 2020-10-22
    • 2010-09-16
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多