【问题标题】:Method that returns either false or an array only tests as false or true返回 false 或数组的方法仅测试为 false 或 true
【发布时间】:2019-12-04 00:04:19
【问题描述】:

我正在研究一种返回 false 或数组的方法。当我在另一个方法中调用此数组并尝试将其分配给一个变量时,我希望该变量持有 false 或返回的数组。

发生的情况是,当我将方法的结果分配给变量时,它只会导致 true 或 false 而不是 false 或数组

我在被调用的方法中使用了 pry 方法来确定要返回的内容。我已经确认将返回一个数组,然后通过额外的撬动确定该变量仅在返回数组时设置为 true

WIN_COMBINATIONS = [
  [0,1,2],
  [3,4,5],
  [6,7,8],
  [0,3,6],
  [1,4,7],
  [2,5,8],
  [0,4,8],
  [2,4,6]
  ]

def won?(board)
  #for the purpose of this study, winner(board) returns nil or "X" or "O"
  result = winner(board)
  if result == nil 
    #if the result of winner is null, return false
    return false  
  end
  #return the array at location 0
  return WIN_COMBINATIONS[0]
end

def play(board)
  #i'm attempting to assign the return of the won? method to result
  result = won?(board)
  #when result is evaluated, when an array is being returned, result becomes true or false,
  #rather than what I'd expect as false or an array
end

【问题讨论】:

  • 该代码不是惯用的 ruby​​,但它可以工作(result 将被分配给一个数组。)在其他地方存在一个诱发问题。请发布所有代码(包括如何检查它是一个数组。)
  • @AlekseiMatiushkin 由于我是 ruby​​ 的新手,我对您的“非常不习惯”的说法很感兴趣。现在是我学习应该如何编写它的时候了 :) 为了检查我的代码,我在 win 中的 return 语句之前使用了 binding.pry?并询问 WIN_COMBINATIONS[0] 是什么。另一个 binding.pry 放置在方法 play 中的结果分配之后,在那里检查结果
  • 看起来代码应该可以工作,但不知道#winner 在做什么,我无法判断。顺便说一句,您可以缩短方法并返回:winner(board).nil? ? false : WIN_COMBINATIONS.first
  • @HP_hovercraft #winner 返回 nil、“X”或“O”。欣赏编码技巧;)
  • 也许#winner 方法在任何状态下都不会返回 nil。您可以对其进行单元测试以确保它正在这样做?

标签: arrays ruby methods


【解决方案1】:

最好坚持以问号结尾的方法应该返回 truefalse 的约定,这肯定是更惯用的 ruby​​。

在你的例子中可能是这样的

def won?(board)
  !!winner(board)
end

然后在方法内部play

def play(board)
  result = won?(board) ? WIN_COMBINATIONS[0] : false
  # or a shorter one line 
  # result = won?(board) && WIN_COMBINATIONS[0]
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多