trick2015 yoshi-taka さんの作品を読むやつ

最近毎週水曜日に trick 読書会というのが開催されておりましてそこで読んだネタをブログ記事にしておくやつです。

先週読んだのはコレ。

trick2015/entry.rb at master · tric/trick2015 · GitHub

とりあえずぱっとみ markdown ファイルにしか見えないやつですが、なんと ruby スクリプトとして実行すると正常終了します。不思議

いくつかコアの概念があるので読んでて気づいたものを紹介します。

後置 if と短絡評価の and

ruby スクリプトとして実行するには2つの壁があります。 syntax error にならないこと、例外なく実行できることの2つです。この後置 if は後者の壁をすり抜けるのによく使います。

# 存在しないメソッド呼び出し、ローカル変数参照、定数参照はエラー
no_such_method

no_such_method if false # 後置 if の条件が満たされないので メソッドがなくてもエラーにならない
NoSuchConstant if false # 同様に存在しない定数でもエラーにならない

また同じような処理として11行目などは後置 until の後置 rescue と重ねられています。

後置 if により、この ruby スクリプトのうち実行される部分がめちゃくちゃ少なくなっています。

行末ピリオド

ruby はメソッド呼び出しのカッコを省略できることもあり、適当に単語を羅列していてもなんとなく syntax としては通ります。

foo bar baz # ok
foo(bar(baz)) # 上と同じ意味

ですが、これだけでは英文を書くことはできません。なぜなら改行した瞬間に式の終わりとみなされて評価がされてしまうからです。このまま実行すると NoMethodError で落ちることになります。しかし、それを行末にピリオドを置くことで回避しています。

まるで文末に置かれてる句点かのようにみえる . ですが、 ruby においてはレシーバーに対するメソッド呼び出しの起点になっています。これによってパーザに「まだこの行は終わってないよ」と錯覚させることができます。

Description from Ky.
----------
What if # 以下略

これは Ky に対する - メソッド呼び出しで、引数が単項演算子 -@ が 9個ついた What として解釈されます。 -> Ky.-(---------What)

なのでこの1, 2 行目には後置 if がないようにみえますが実際には3行目の後置 if まで1つの式としてつながっており、キャンセルすることができます。

ちなみに2行目のハイフン列は上記のように解釈されていますが、7行目の場合には単項 -@ を10個ならべた 2020 について9行目で演算する形式になっておりネタかぶりを防いでいます。

さりげない : と - と .

22行目の行末には : があり、英文的にも「以下のように」と実例を見せる感じで使われてますね。でも ruby スクリプトなので : が解釈できるかどうかが争点になります。実際にはこれは like メソッドのキーワード引数 this として this: 'ruby (略)' を渡している形式になります。これはさりげなく上手いなと思いました。

また、ruby -v- は単項演算子 -@ を用いて ruby(-v) となっていますし、 ruby entry.rb. はメソッド呼び出しになっています。コマンドライン上の操作も ruby スクリプトとして syntax ok になっているのもおもしろポイントですね。


今回は2015でしたが2013についてもなんとなく読んではいて、いずれ記事を書くかもしれません。