如何在循环中重置局部变量的值?

时间:2015-11-09 14:36:30

标签: ruby loops

我想指出我为此找到了一个解决方案,我得到的最接近的是this。但是,我无法看到如何使用map来解决我的问题。我是Ruby的新手,所以请记住这一点。

这是我正在玩的一些代码(简化):

def base_word input
    input_char_array = input.split('') # split string to array of chars
    @file.split("\n").each do |dict_word|
        input_text = input_char_array
        dict_word.split('').each do |char|
            if input_text.include? char.downcase
                input_text.slice!(input_text.index(char))
            end
        end
    end
end

我需要在每个周期后将input_text的值重置回input_char_array的原始值,但是由于Ruby是基于引用的,我从我收集的内容,我使用行{ {1}}会反映在原始引用中,因此我最终会很快将input_text.slice!(input_text.index(char))分配给空数组。

如何减轻这种影响?如上所述,我试图使用input_text,但也许我还没有完全理解我应该如何去做。

2 个答案:

答案 0 :(得分:1)

您可以通过克隆数组来获得独立引用。显然,这会影响RAM的使用。

input_text = input_char_array.dup

答案 1 :(得分:1)

短而坦率的不是很好的答案

使用slice!覆盖变量,相当于

input_text = input_text.slice # etc.

如果您使用普通的slice,则不会覆盖input_text

更长,更坦率,更好的答案

在Ruby中,代码嵌套四层深度通常是一种气味。让我们重构,并且根本不需要重置循环。

我们不是用换行符拆分文件,而是使用Ruby的内置文件处理模块来读取这些行。记住它(||=运算符)可能会阻止它在每次引用时重新加载文件,如果我们多次运行它。

def dictionary
  @dict ||= File.open('/path/to/dictionary')
end

我们也可以在打开文件时立即将所有单词设为小写,因为在原始示例中每个字符都是单独缩小的。

def downcased_dictionary
  @dict ||= File.open('/path/to/dictionary').each(&:downcase)
end

接下来,我们将使用Ruby的内置文件和字符串函数(包括#each_char)进行比较并输出结果。我们不需要将任何输入转换为数组(完全!),因为#include?适用于字符串,#each_char遍历字符串的字符。

我们将字符串拆分分解为自己的方法,因此可以更清楚地理解循环逻辑和字符串逻辑。

最后,使用#slice代替#slice!,我们不会覆盖input_text,完全避免以后需要重置变量。

def base_word(input)
  input_text = input.to_s # Coerce in case it's not a string
  # Read through each line in the dictionary
  dictionary.each do |word|
    word.each_char {|char| slice_base_word(input_text, char) }
  end
end

def slice_base_word(input, char)
  input.slice(input.index(char)) if input.include?(char)
end