<<运算符将字符串添加到列表代理奇怪 - Ruby
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了<<运算符将字符串添加到列表代理奇怪 - Ruby相关的知识,希望对你有一定的参考价值。
我正在尝试将一个字符串(由另一个字符串中的字符组成,迭代通过for循环)附加到数组。但出于某种原因,当我最终输出数组的项目时,他们全都关闭了。
这是我的代码的输出:
r
racecar
a
aceca
c
cec
e
c
a
r
Final list:
racecar
racecar
acecar
acecar
cecar
cecar
ecar
car
ar
r
我尝试在我的语句末尾添加一个空字符串,就像这样,
list << string_current + ""
它似乎解决了这个问题。有人知道为什么吗?
def longest_palindrome(s)
n = s.length
max_string = ""
max_string_current = ""
string_current = ""
list = []
counter = 0
for i in (0...n)
for j in (i...n)
string_current << s[j]
# puts "string_current: #{string_current}"
if is_palindrome(string_current)
counter += 1
puts string_current
list << string_current
end
end
string_current = ""
end
puts "Final list:"
list.each do |item|
puts "#{item}"
end
end
def is_palindrome(string)
for i in (0..string.length/2)
if string[i] != string[string.length-1-i]
return false
end
end
return true
end
longest_palindrome("racecar")
我认为我最终列表中的项目应与列入其中的项目相同。
list << string_current
答案
这个:
string_current << s[j]
就地修改字符串。这意味着:
list << string_current
可以将正确的字符串放入list
,然后可以稍后修改该字符串。
当您附加空白字符串时:
list << string_current + ""
你正在创建一个全新的字符串(string_current + ""
),然后将这个新字符串推送到list
,所以你这样做:
tmp = string_current + ""
list << tmp
解决问题的几种简单方法是明确地复制字符串:
if is_palindrome(string_current)
counter += 1
puts string_current
list << string_current.dup # <--------------------
end
或者在+=
上使用<<
而不是string_current
:
for i in (0...n)
string_current = ''
for j in (i...n)
string_current += s[j]
您还应该考虑使用for
中的方法替换您的Enumerable
循环(在Ruby中很少见)。我现在不想再去一个重构的兔子洞了,所以我会把它留给读者练习。
另一答案
你也可以修复它
list << string_current.dup
但真正的问题是你的
string_current << s[j]
尝试(例如在irb中)以下示例:
list=[]
str='ab'
list << str
str << 'x'
puts list
您将看到该列表现在包含'abx'
,而不是'ab'
。
原因是列表包含对字符串的对象引用(指针),当您执行str << 'x'
时,您不创建新对象,而是修改现有对象,因此list
会看到更新后的版本。
以上是关于<<运算符将字符串添加到列表代理奇怪 - Ruby的主要内容,如果未能解决你的问题,请参考以下文章
如果使用“+”运算符添加列表,为啥 Kotlin 会将 List<List<Int>> 类型的列表更改为 List<Any>?