https://megurorb.connpass.com/event/55107/
Meguro.rb #2 でのLT資料です。
だれこれ
本題: Ruby はむずかしい
お前は自分で書いた Ruby コードの構造を理解しているのか?
例題1) 何を出力するでしょうか
print(% % %%%%)
(Syntax Highlight に騙されるな!)
こたえ
出力されるのは%
# 等しい構造のコード例
print('%' % '')
# 実際には改行は出力されない
$ ruby -e 'print(% % %%%%)'
%
$ ruby -e "print('%' % '')"
%
Twitter でアンケートを取ったら、サイコロの方が優秀だった
[アンケートになっています]
— Pocke (@p_ck_) 13 March 2017
以下のRubyコードは何を出力するでしょうか
print(% % %%%%)
人間が Ruby を書くより、鉛筆転がして書いたほうがマシ
例題2) 単純な URL は Ruby のコード
http://example.com
(Syntax Highlight はウソをついている)
$ ruby -c -e 'http://example.com'
Syntax OK
こたえ
例えば、こんな感じのコードを仕込めば実行できる
class Symbol
def /(right)
"Hello, #{right}!"
end
end
def example
Struct.new(:com).new('Ruby')
end
def http(arg)
p arg
end
http://example.com # => "Hello, Ruby!"
例題3) 実際に RSpec であった例
it 'changes foo' do
expect { subject }.to change { foo.hoge }
.and change { foo.fuga }
.and change { foo.poyo }
.and change { foo.piyo }
end
スマートに見えるけど、これはどういう構造??
(いい感じに書く方法があったら教えて下さい…)
こたえ) 同じ構造のコード
expect { subject }.to(
change { foo.hoge }.and(
change { foo.fuga }.and(
change { foo.poyo }.and(
change { foo.piyo }
)
)
)
)
Ruby はむずかしい!!!
では、むずかしい Ruby と戦うにはどうしたらいいか
Bacon Cannon 🥓
An online Ruby parser. Support multiple Ruby versions, and multiple parsers(Ripper and Parser gem).
https://bacon-cannon.herokuapp.com
参考リンク
- Ruby 用オンラインパーサーを作っている http://pocke.hatenablog.com/entry/2017/04/08/214225
- Bacon Cannon のアーキテクチャ http://pocke.hatenablog.com/entry/2017/04/10/141643
DEMO
まとめ
- Ruby はむずかしい
- Syntax Highlight に惑わされてはいけない
- Bacon Cannon を使えばむずかしい Ruby のコードを理解する手助けになる
ご清聴ありがとうございました