Ruby 如何在循环中重置局部变量的值?
我想指出的是,我已经非常广泛地试图找到解决这个问题的方法,我得到的最接近的方法是。然而,我不知道如何使用Ruby 如何在循环中重置局部变量的值?,ruby,loops,Ruby,Loops,我想指出的是,我已经非常广泛地试图找到解决这个问题的方法,我得到的最接近的方法是。然而,我不知道如何使用map来解决我的问题。我是Ruby的新手,所以请记住这一点 下面是我正在使用的一些代码(简化): 我需要在每个周期后将input\u text的值重置回input\u char\u array的原始值,但是从我收集的数据来看,由于Ruby是基于引用的,所以我对input\u text.slice行所做的修改!(input_text.index(char))会反映回原始引用中,结果我很快就将in
map
来解决我的问题。我是Ruby的新手,所以请记住这一点
下面是我正在使用的一些代码(简化):
我需要在每个周期后将input\u text
的值重置回input\u char\u array
的原始值,但是从我收集的数据来看,由于Ruby是基于引用的,所以我对input\u text.slice行所做的修改!(input_text.index(char))
会反映回原始引用中,结果我很快就将input_text
分配给了一个空数组
我如何减轻这种影响?如前所述,我曾尝试使用
.map
,但可能我还没有完全了解应该如何操作。通过克隆阵列,您可以获得一个独立的参考。显然,这对RAM的使用有一定的影响
input_text = input_char_array.dup
这个简短而坦率的回答不是很好
使用切片代码>就地覆盖变量,相当于
input_text = input_text.slice # etc.
如果您使用普通的旧切片
,它将不会覆盖输入文本
更长久、更坦率地说是更好的答案
在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?
对字符串有效,并且#每个字符
对字符串的字符进行迭代
我们将把字符串拆分分解为它自己的方法,这样可以更清楚地理解循环逻辑和字符串逻辑
最后,使用#slice
而不是#slice
,我们不会覆盖输入文本
,完全避免了以后重置变量的需要
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
使用#slice
而不是#slice会更有意义吗代码>在这里,并避免整个#dup
复制?那么slice
将进行一些复制。对,只是认为这是少了一个方法调用。二者都是有效的;我不确定这两种方法是否有明显的好处。我对此投了赞成票,因为我发现它很有用,并且对我的问题有帮助——如果能看到更多的解释/可能的替代方案/含义,那就太好了!您对输出的期望是什么?您正在对文本进行切片,但它看起来并没有打印或返回到任何地方。#map
无法解决您问题中的问题,但它有助于输出。当你包含一些关于预期输出的信息时,我会用#map
更新我的答案。我没有包含任何关于这方面的信息的原因是因为我真的不相信它是相关的——我的观点是,对输入文本进行任何形式的修改都会导致输入字符数组的原始值也被忽略改变了,因此否定了我在“重置”输入文本中试图实现的目标
谢谢,马特。我投了赞成票,因为这是一个非常详细和深思熟虑的答案。我现在还在读这本书——但作为Ruby的初学者,这本书非常有帮助,因为它介绍了一些我可能需要花一段时间才能发现的想法。我很感激你对这个问题缺乏背景知识,但这并不能完全帮助解决我手头的问题,所以我将Sergio的作为正确答案。再次感谢你给我展示了一些在将来会很有用的想法。
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