gpt4 book ai didi

ruby - StringIO 实例改变原始字符串

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:14 28 4
gpt4 key购买 nike

我在使用 Ruby 的 StringIO 类时观察到一些非常奇怪的行为。

在 irb 控制台中输入以下内容:

2.3.0 :002 > original_string = 'test'
=> "test"
2.3.0 :003 > original_string.encoding
=> #<Encoding:UTF-8>

编码为 UTF-8。现在构造一个新的 StringIO 实例

2.3.0 :004 > io = StringIO.new(original_string)
=> #<StringIO:0x007fe0ad08e4f0>
2.3.0 :005 > original_string.encoding
=> #<Encoding:UTF-8>

original_string 仍然是 UTF-8,现在在派生的 StringIO 实例上设置编码

2.3.0 :006 > io.set_encoding('BINARY')
=> #<StringIO:0x007fe0ad08e4f0>
2.3.0 :007 > original_string.encoding
=> #<Encoding:ASCII-8BIT>

原始字符串编码已变异为 ASCII!这是预期的行为吗?构造 StringIO 对象 StringIO.new(original_string.freeze) 可以防止编码更改,而不是引发错误,如果更改 original_string 的编码是预期的,我会期望.

知道这里发生了什么吗?

谢谢

最佳答案

这是故意的 - 如果流是可写的(在 IOString 的情况下,如果底层字符串是可写的)那么流上的 set_encoding 也会设置底层字符串的编码。

https://github.com/ruby/ruby/blob/trunk/ext/stringio/stringio.c#L1602

关于ruby - StringIO 实例改变原始字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48156725/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com