1
0

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 3 years have passed since last update.

Rubyのクワインを読む

Posted at

はじめに

Rubyのクワインとして紹介されていた2つを解読してみました。
割と頭がこんがらがるので、順を追って書いていきます。

コードは下記から拝借しました。
https://stackoverflow.com/questions/2474861/shortest-ruby-quine/2475931#2475931

1つ目

コード

_="_=%p;puts _%%_";puts _%_

解説

まず、演算子の前後にスペースを入れます。
セミコロンは改行します。

_ = "_=%p;puts _%%_"
puts _ % _

1行目は変数_への代入式でした。
2行目で参照しているので、展開します。

puts "_=%p;puts _%%_" % "_=%p;puts _%%_"

%演算子の挙動はsprintfと同様です。フォーマット、変数の順です。
%pはObject#inspectの結果で置き換えられます。
%%は%自身を出力します。

%pの前後で分割して、敢えて文字列連結で書くとこうなります。

puts "_=" + "_=%p;puts _%%_".inspect + ";puts _%_"

inspectの結果を展開して

puts "_=" + "\"_=%p;puts _%%_\"" + ";puts _%_"

文字列連結します。

puts "_=\"_=%p;puts _%%_\";puts _%_"

あとはputsの出力結果を見るだけです。

_="_=%p;puts _%%_";puts _%_

2つ目

コード

puts <<2*2,2
puts <<2*2,2
2

解説

このコードはヒアドキュメントを使っています。
1行目の<<2が開始ラベル、2行目が本体、3行目が終端行です。
また、Rubyでは開始ラベルが値を返すので、続けて*2,2と処理を書いています。

まず、演算子の前後等に空白をいれます。

puts <<2 * 2, 2
puts <<2*2,2
2

ヒアドキュメントを展開してみます。
改行があるので注意をしつつ

puts "puts <<2*2,2\n" * 2, 2

*演算子は文字列を指定した回数分繰り返します。

puts "puts <<2*2,2\nputs <<2*2,2\n", 2

あとはputsの実行結果を見るだけです。
与えられた引数を続けて出力します。

puts <<2*2,2
puts <<2*2,2
2

参考

1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?