🐷
[Bug #21187] Hash リテラルで がある場合に意図せず frozen されてしまうバグ報告
[Bug #21187] Strings concatenated with \ getting frozen with literal hashes (PRISM only)
- 次のように Hash リテラルの値で
\を使った文字列の結合がある場合にPrismを使用していると意図せず文字列がfrozenされてしまっているというバグ報告
x = {
a: 'one' \
'two',
b: 'three' \
'four',
c: 'five',
d: 'six' \
'seven'
}
y = {
a: 'one',
b: 'two' \
'three'
}
# x の定義で a と b がなぜか frozen になっている
puts "x = #{x.map { |k,v| {k => v.frozen?} }}"
# => x = [{a: true}, {b: true}, {c: false}, {d: false}]
# y はどちらも frozen ではない
puts "y = #{y.map { |k,v| {k => v.frozen?} }}"
# => y = [{a: false}, {b: false}]
-
parse.yの場合はすべてfrozenされていない文字列になっている - これは
Prismの最適化による影響みたいですね - この不具合は開発版の Ruby 3.5-dev で修正済み
x = {
a: 'one' \
'two',
b: 'three' \
'four',
c: 'five',
d: 'six' \
'seven'
}
y = {
a: 'one',
b: 'two' \
'three'
}
puts "x = #{x.map { |k,v| {k => v.frozen?} }}"
# Ruby 3.4 => x = [{a: true}, {b: true}, {c: false}, {d: false}]
# Ruby 3.5 => x = [{a: false}, {b: false}, {c: false}, {d: false}]
puts "y = #{y.map { |k,v| {k => v.frozen?} }}"
# Ruby 3.4 => b = [{a: false}, {b: false}]
# Ruby 3.5 => b = [{a: false}, {b: false}]
Discussion