LoginSignup
126
116

More than 5 years have passed since last update.

IQ1450で美少女JSの先輩から、Rubyで無から有を生み出す方法を教わった

Last updated at Posted at 2015-01-25

IQ1450で美少女JSの先輩「

存在しないローカル変数の参照について

Rubyでは存在しない変数名を参照しようとするとエラーになります。

p sugoi
#=> NameError: undefined local variable or method `sugoi' for main:Object (NameError)
kanari = totemo
#=> NameError: undefined local variable or method `totemo' for main:Object

この点について疑問に思う方は居ないかと思います。

それを前提に、今日はRubyで無から有を生み出す方法をお伝えしましょう。

以下の縛りを導入します。

  • 一度宣言・初期化した変数は他の式・文で使用しない
  • 演算子および演算子風のシンタックスシュガーが導入されたメソッド、及び代入、また括弧のみが使用できる

truefalseの生成

truefalseを生成します。上記縛りを守ったままこれを達成することは可能でしょうか?

t = !t
p t #=> true

f = !!f
p f #=> false

可能です。

不思議ですね、一体何が起こったのでしょうか。

これは、変数に値を代入するようなコードをパーサが読んだ瞬間、その変数がnilで初期化されるという仕様を悪用したコードです。

trueの生成の例で解説すると、代入の左辺をパーサが読んだ段階で変数tnilで初期化されるため、右辺の!tを評価することは!nilを評価することと同義です。

!nilの評価結果はtrueとなるので、変数tにはtrueが代入されることとなります。

falseの例も同じで、!!nilfalseであることを利用しています。

整数の生成

次に整数を生成してみましょう。

zero = zero <=> zero
p zero #=> 0

one  = (one <=> one) ** (one <=> one)
p one #=> 1

いいですね。nil.to_i0となりますが、メソッドを使用すると面白くないということで採用した縛りにより、メソッドについては演算子風のシンタックスシュガーが導入されたものしか使用することができません。そこで<=>メソッドを使用することで0を得ることにしました。

0を得ることができれば1も得られます。同じ要領で0を二つ生成し、**メソッドによって0の0乗を求めます。1です。

0と1があればあとは任意の整数が生成可能なので、そこは省略します。

まとめ

というわけで、皆さんもRubyで無から有の生成をやってみてください。業務には一切役に立たないと思います。

  • Symbolを生成する方法
  • Arrayを生成する方法
  • できるだけ無を用いてFizzBuzzをアレする方法

などは読者への課題とします。

ぼく「なるほど」

126
116
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
126
116