先日、以下の RuboCop のイシューを見ていて知った小ネタ。ふたつ。
ひとつ目。この Issue #6099 は String オブジェクトの式展開は異なるオブジェクトを返すので (それはそうだ) 、単に to_s
ではなく dup
などを使って異なるオブジェクトを返すと良さそうというもの。実践的には (そもそもこの Cop に引っかかるケースがどれくらいあるか分からないけれど) Frozen String Literal とか関わってくると auto-correct がイケてなくなって問題になりえそう (そのケースでも元々が式展開ではなく dup
とか +@
の出番だと思うが) 。
> str = 'foo' > str.object_id # => 70267943192580 > "#{str}".object_id # => 70267943647500 > str.to_s.object_id # => 70267943192580
この Issue に対していちおう手元に WIP ブランチがあるものの、式展開の対象が String オブジェクトのときは str.to_s.dup
することで "#{str}"
と同様の効果になるが、他のインスタンスのケースは無駄な dup
になるので限定的な解決を目指すにはどうしたらというところで pending しているイシュー。このあたりがあると条件を絞れそうな気がしている。
ふたつ目。インスタンス変数、クラス変数には以下のように {
...}
を略した記法が使える。
> @var = 'foo' > "#@var" #=> "#{@var}" と同様の効果 > @@var = 'foo' > "#@@var" #=> "#{@@var}" と同様の効果
自主的には使わないけれど。