Rubyの式展開小ネタ

先日、以下の RuboCop のイシューを見ていて知った小ネタ。ふたつ。

github.com

ひとつ目。この 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}" と同様の効果

自主的には使わないけれど。