🐷
[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