内容
- PHPer(Laravler)が感じたRuby(Rails)への感想
私の背景
- PHP成分が多い人生
- 初期だとFuelPHPとか触ってた
- ここ数年はLaravel使ってた
- Rubyは2011年頃に遊びで触ってた
- メタプログラミングRubyとか読んで興奮した記憶はある
- この当時のRailsを触って「ほーん、なるほど」、みたいに思った記憶もある
- 仕事では結局使わなかったけど、Project Euler をRubyで解いたりしてみてた
といった感じの背景です。
最近Railsで仕事することになったので、PHPer(というかLaraveler)が感じたRailsに対するギャップをいくつか書きたいと思います。
すでにRailsのプロジェクトがあり、そこにJOINした感じです。
Autoloadがわからない
PHPのロード
require_once __DIR__ . '/path/to/file.php'
Rubyのロード
require "path/to/file"
ここまではなんの問題もなくわかるんですが、autoloadがわからない。
PHPの場合
namespace \Foo;
use \Foo\Bar\Hoge;
class Xxx extends Hoge {
}
みたいな感じで「利用するクラスのフルパスを書かなければならない」っていう制約があるので、面倒ではあるんだけど「 (appRoot)/Foo/Bar/Hoge.php
にあるんだな」っていうことが分かる。
最近はほとんどPSR-4のautoloadが多いと思うので、PSR-4読めばいいと思う
参考: https://qiita.com/inouet/items/0208237629496070bbd4
Ruby(Rails)の場合
module Foo do
class Xxx extends Hoge
end
end
なんなん!?!?!?急に Hoge
どこから出てきたん!?!?!?!?
Hogeって誰なの!?!?!?!
ってすごく思った。
https://qiita.com/eggc/items/ae09d32df5d994522ca1
https://qiita.com/tachiba/items/5b293ca8e9430b9bd07e
最新のバージョンでどう動くかはわからんですけど「Railsが頑張って探してるんや」って言われて納得。
納得すると同時に「あぁ〜〜〜パスを明示したいんじゃ〜〜〜」という気持ちになる。
カッコがない
追記: 以下「カッコがない」の項については私の勘違いが多分に含まれてたのでスルーしてください。
コメントにてご指摘いただき、ありがとうございました
PHPのこれが
piyo(bar(foo($x)));
Rubyだとこうなる
piyo bar foo x
いいんだけど、「どんだけカッコ嫌いなん???」って気持ちで溢れた。
foo
の引数が3つあるときは
piyo bar foo 1,2,3
ってなって、なんか、分かるんだけど、なんやねんカッコ書きたいやんって気持ちになる
piyo(bar(foo(1,2,3))
シックリくる〜〜!
って思うけどRubocopとか言うやつが「カッコ書くなや」みたいにいってくる。もうやだ。
blockに感じる違和感
[1,2,3].reject {|n| n > 2}.map {|n| n * 2}.map &:to_s
これと
[1,2,3].reject do |n|
n > 2
end.map do |n|
n * 2
end.map &:to_s
これって同じ感じだけど、なんで構文2つ分けたん。どっちかひとつでいいじゃんね!
end.map
とかにすごくなにか感じる。
returnが無い
def hoge(x)
if x > 5
return x * 3
end
x
end
returnつけたりつけなかったり!!!なんなの!!!
不要なのにreturnつけるとRubocopが「てめぇreturnつけてんじゃねぇよ!」とか言ってくるしもう。もう。
RubyDocが無い・・・?
最近のPHPは割と型がしっかり・・・とは言わないけど、少なくとも宣言する際の不便はかなりなくなってきた。
コンパイル用っていうよりは、プログラミングするときの手助けとしての型、という側面でとても便利。
PHP7より前の時代においてもPHPは PHPDoc
で何となく「型が何なのか明示しろや」文化が多少なりとあった。
class Foo {
/**
* @param integer $x
* @param integer $y
* @return integer
*/
public function something($x, $y) {
return $x * $y;
}
}
みたいな感じで、「俺は型を宣言したいんじゃ!!!」という欲求に応えてくれた。
class Foo {
public function something(int $x, int $y): int {
return $x * $y;
}
}
最近はこんな感じにスマートにかけてよかったね^^という気持ち
JSにもTypeScript以前にJSDocあったし、当然RubyにもRubyDocがあると思ってた。
そしたら、RubyDocはなんか違うやつだった。ドキュメント作るやつ。
ちゃうねん、そうじゃないねん。
一応RDLってやつがあるみたいだけど、なんか違うというか・・・too muchというか・・・。
「Rubyの思想・文化的にそういう型宣言とは仲良くない」的なことだってのはわかってるんですが、「引数が何くるのかわからない状況ってのが怖くて、「え・・・string渡してくるバカがいたら死ぬの・・・?」みたいな気持ちになる。「string渡してくるやつがアホい」っていう思想なんだろうけど。
まとめ
なんか他にもいろいろあったと思うんですけど、思い出した範囲で感じた違和感をかきました。
別にRubyをディスってるわけじゃなくて「全然Rubyの世界観に馴染めてない俺」っていう感じです。
ワンライナー書いたりとかRspecのDSL感とか、書いててシックリくることも多いのですが、なんかやっぱ型システム周りの思想の違いは大きいなぁと思ってます。
ダックタイピングって誰得なのかがまだわかってないので、しっくりくる日を待ち望んでます。
かしこ