28
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RubyAdvent Calendar 2016

Day 3

Rubyのバッククォート(`)は再定義できるらしい

Last updated at Posted at 2016-12-06

Ruby Advent Calendar 2016の3日目が空いてたので、代わりに投稿してみました。Rubyのちょいネタです。

Rubyでは演算子の多くが再定義可能です。

Ruby 2.2.0 リファレンスマニュアル > 演算子式

再定義可能な演算子の中にバッククォート(`)があるのですが、バッククォートの再定義ってどんな挙動になるのかちょっと想像できません。

なので色々試してみました。

コマンド出力リテラルが再定義できた

結論から言うと、コマンド出力のリテラルが再定義できました。バッククォートで囲まれた文字列をコマンドとして実行するアレですね。

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になってしまいました。同様に、ブロックを渡すのも無理でした。もし、何らかの方法で第二引数やブロックを渡すことができれば夢が広がるんですけど・・・

28
8
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?