<<运算符将字符串添加到列表代理奇怪 - 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>?

std::set 和 < 运算符重载的奇怪行为?

将 QName 作为字符串添加到 @XmlMixed@XmlAnyElement(lax = true) 列表

将 List<boolean> 转换为字符串

将项目添加到列表时,python 中的奇怪问题是删除 \xa0 和其他编码[重复]