如何让我的方法将结果值返回给第三种方法

时间:2017-09-16 19:05:11

标签: ruby

我不确定主题标题是否足够具体,但这里有。我有两个方法 - 一个迭代一些数组以及块中的条件以推出正确的数据。

这是代码

def iterate_lines
  WIN_COMBINATIONS.each_with_index do |line,index|
    lines = @board[line[0]] + @board[line[1]] + @board[line[2]]
      if lines.include?("X") && !lines.include?("O")
        scores = tally_scores(lines.count("X"),"X",index)
          elsif lines.include?("O") && !lines.include?("X")
        scores = tally_scores(lines.count("O"),"O",index)
          elsif lines.include?("X") && lines.include?("O")
        scores = tally_scores(0,"",index)
          elsif !lines.include?("X") && !lines.include?("O")
        scores = tally_scores(0,"",index)
      end
      p scores
  end
end

另一种方法是根据我选择的启发式方法计算得分。

def tally_scores(score,player,index)
  score =    1 if score == 1 && player == "X"
  score =   -1 if score == 1 && player == "O"
  score =   10 if score == 2 && player == "X"
  score =  -10 if score == 2 && player == "O"
  score =  100 if score == 3 && player == "X"
  score = -100 if score == 3 && player == "O"  
  score
end

调用' iterate_lines我可以从“tally_scores”中输出正确的值,或者正如我在此处所示,通过设置变量'得分'通过' iterate_lines'进行调用,这样我就可以将它们从#iterate_lines'中打印出来。

自然地来自' iterate_lines'的返回值。是数组(WIN_COMBINATIONS)。硬编码return scores显然会给我最后一个值。

我的问题是我有第三种方法,需要从“tally_scores”中得到什么?然而,我无法将其作为常规论点传递,即my_method(scores)。原因是第3种方法有它自己的参数列表,由于其他原因它被传递。此外,在调用该方法之前,它将是零。

def get_scores
  # other code
  #: something like this:
  score = iterate_lines 
  # or
  score = tally_scores
  # or
  # ?
end

所以我觉得我可能会把自己放在一个角落,应该把我所拥有的东西丢弃并重新启动。我会说我尝试了“tally_scores'并将分数放入实例变量数组中。我发现当我通过它时,除了最后一个值之外的所有值都保持不变。

1 个答案:

答案 0 :(得分:1)

这里有几个问题。首先,正如您在使用each_with_index时所看到的那样,除了使用副作用外,该块中发生的任何事情都不会产生影响。如果您在该块中设置变量,则每次迭代都会重置该变量。

您可以将其更改为map.with_index,以便结果是迭代产生的结果数组。

此处似乎scores应该是score,并且与此类似,因为tally_scores会返回一个分数:

scores = tally_scores(lines.count("X"),"X",index)

如果你正在使用map.with_index,那么该块的返回值应为score,这样结果将是一个得分数组。但是,您无法使用块中的return score,它将从父方法返回,而不是块的单次迭代。您可以使用next score代替score作为最后一行。

进行这些更改后,您可以说scores = iterate_lines

它看起来像这样:

def iterate_lines
  WIN_COMBINATIONS.map.with_index do |line, index|
    # set score according to your conditional logic
    score # or alternatively, "next score"
  end
end

最好将打印逻辑提取到其他地方,例如:

scores = iterate_lines
scores.each { |score| p score }