Ruby Advent Calendar 2016の3日目が空いてたので、代わりに投稿してみました。Rubyのちょいネタです。
Rubyでは演算子の多くが再定義可能です。
再定義可能な演算子の中にバッククォート(`)があるのですが、バッククォートの再定義ってどんな挙動になるのかちょっと想像できません。
なので色々試してみました。
コマンド出力リテラルが再定義できた
結論から言うと、コマンド出力のリテラルが再定義できました。バッククォートで囲まれた文字列をコマンドとして実行するアレですね。
p `pwd` # カレントディレクトリのパスを文字列として出力
以下のように再定義可能です。
def `(x)
何らかの処理
end
バッククォートで囲まれた内側の値が、引数として渡るようです。
有効な活用方法を考えてみる
正直、有意義な活用方法が思い浮かびません・・・
強いて言うなら、
def `(x)
eval x
end
`puts "hello world"`
とかでしょうか。
ちなみに、バッククォートを再定義した場合は**%記法も再定義**されるようです。
def `(x)
x.split.map(:&to_i).reduce(:+)
end
p %x{1 2 3 4 5} # => 15
うまく活用すれば面白いことができそうです。
残された謎
バッククォートの再定義時には、引数を複数指定することができます。
def `(x, y)
x + y
end
しかし、この記法に第二引数を渡す方法が分かりません。色々試しましたが、いずれもSyntaxErrorになってしまいました。同様に、ブロックを渡すのも無理でした。もし、何らかの方法で第二引数やブロックを渡すことができれば夢が広がるんですけど・・・