我想指出我为此找到了一个解决方案,我得到的最接近的是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
,但也许我还没有完全理解我应该如何去做。
答案 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