Ruby中的递归问题:我是否遇到副作用?

时间:2013-11-27 01:06:43

标签: ruby recursion

我有两种方法:

def word_square_word_list
  @word_list.each do |word|
    return_value = find_next_word([word])
    #check return_value here and it is completely different than what is returned from the find_next_word method.
    return return_value if is_list_valid?(return_value)
  end
end

def find_next_word(word_list_array)
  if word_list_array.length == @size_of_square
    #confirm word_list_array is what I expect here
    word_list_array
  else
    start_of_next_word = word_list_array.map{|w| w[word_list_array.length]}.join
    get_all_words_that_start_with(start_of_next_word).each do |word|
      find_next_word(word_list_array + [word])
    end
  end
end

我可以使用binding.pry确认word_list_array返回的find_next_word实际上是正确的值。但是当我去检查返回值时,它就完全不同了。

我能想出的唯一解释是,我正在经历实施的副作用。有没有人对可能导致这种情况的原因有任何想法?

1 个答案:

答案 0 :(得分:1)

您似乎缺少一些代码,因为word_list_array中的word_square_word_list目前尚未定义。

如果您提供了出错的示例,将会很有帮助。也就是说,我怀疑问题在于:

get_all_words_that_start_with(start_of_next_word).each do |word|
  find_next_word(word_list_array + [word])
end

您正在find_next_word块中调用each,但对结果不执行任何操作。 each返回调用它的对象,因此find_next_word案例中get_all_words_that_start_with(start_of_next_word)的返回值为else

值得注意的是word_square_word_list也存在问题。如果您尝试return阻止each阻止,则会获得LocalJumpError: unexpected return例外。