PHPerが久しぶりにRubyを書いて思ったこと

## 内容

- PHPer(Laravler)が感じたRuby（Rails）への感想

## 私の背景

- PHP成分が多い人生
    - 初期だとFuelPHPとか触ってた
    - ここ数年はLaravel使ってた
- Rubyは2011年頃に遊びで触ってた
    - [メタプログラミングRuby](https://www.amazon.co.jp/dp/4048687158/)とか読んで興奮した記憶はある
    - この当時のRailsを触って「ほーん、なるほど」、みたいに思った記憶もある
    - 仕事では結局使わなかったけど、[Project Euler](https://projecteuler.net) をRubyで解いたりしてみてた

といった感じの背景です。
最近Railsで仕事することになったので、PHPer（というかLaraveler）が感じたRailsに対するギャップをいくつか書きたいと思います。
すでにRailsのプロジェクトがあり、そこにJOINした感じです。

## Autoloadがわからない

PHPのロード

```php
require_once __DIR__ . '/path/to/file.php'
```

Rubyのロード

```ruby
require "path/to/file"
```

ここまではなんの問題もなくわかるんですが、autoloadがわからない。

#### PHPの場合

```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)の場合

```ruby
module Foo do
  class Xxx extends Hoge
  end
end
```

なんなん！？！？！？急に `Hoge` どこから出てきたん！？！？！？！？
Hogeって誰なの！？！？！？！

ってすごく思った。

https://qiita.com/eggc/items/ae09d32df5d994522ca1
https://qiita.com/tachiba/items/5b293ca8e9430b9bd07e

最新のバージョンでどう動くかはわからんですけど「Railsが頑張って探してるんや」って言われて納得。

納得すると同時に「あぁ〜〜〜パスを明示したいんじゃ〜〜〜」という気持ちになる。

## ~~カッコがない~~

**追記**: 以下「カッコがない」の項については私の勘違いが多分に含まれてたのでスルーしてください。
コメントにてご指摘いただき、ありがとうございました :bow: 

~~PHPのこれが~~

```php
piyo(bar(foo($x)));
```

~~Rubyだとこうなる~~

```ruby
piyo bar foo x
```
 
~~いいんだけど、「どんだけカッコ嫌いなん？？？」って気持ちで溢れた。~~
~~`foo` の引数が３つあるときは~~

```ruby
piyo bar foo 1,2,3
```

~~ってなって、なんか、分かるんだけど、なんやねんカッコ書きたいやんって気持ちになる~~

```ruby
piyo(bar(foo(1,2,3))
```

~~シックリくる〜〜！~~

~~って思うけどRubocopとか言うやつが「カッコ書くなや」みたいにいってくる。もうやだ。~~



## blockに感じる違和感

```ruby
[1,2,3].reject {|n| n > 2}.map {|n| n * 2}.map &:to_s
```

これと

```ruby
[1,2,3].reject do |n|
  n > 2
end.map do |n| 
  n * 2
end.map &:to_s
```

これって同じ感じだけど、なんで構文２つ分けたん。どっちかひとつでいいじゃんね！

`end.map` とかにすごくなにか感じる。

## returnが無い

```ruby
def hoge(x)
  if x > 5
    return x * 3
  end
  x
end
```

returnつけたりつけなかったり！！！なんなの！！！

不要なのにreturnつけるとRubocopが「てめぇreturnつけてんじゃねぇよ！」とか言ってくるしもう。もう。

### RubyDocが無い・・・？

最近のPHPは割と型がしっかり・・・とは言わないけど、少なくとも宣言する際の不便はかなりなくなってきた。
コンパイル用っていうよりは、プログラミングするときの手助けとしての型、という側面でとても便利。
PHP7より前の時代においてもPHPは `PHPDoc` で何となく「型が何なのか明示しろや」文化が多少なりとあった。

```php
class Foo {
  /**
   * @param integer $x
   * @param integer $y
   * @return integer
   */
  public function something($x, $y) {
    return $x * $y;
  }
}
```

みたいな感じで、「俺は型を宣言したいんじゃ！！！」という欲求に応えてくれた。

```php
class Foo {
  public function something(int $x, int $y): int {
    return $x * $y;
  }
}
```

最近はこんな感じにスマートにかけてよかったね＾＾という気持ち

JSにもTypeScript以前にJSDocあったし、当然RubyにもRubyDocがあると思ってた。

そしたら、RubyDocはなんか違うやつだった。ドキュメント作るやつ。
ちゃうねん、そうじゃないねん。

一応RDLってやつがあるみたいだけど、なんか違うというか・・・too muchというか・・・。

https://qiita.com/baban/items/0f782691b6e6e7213453

「Rubyの思想・文化的にそういう型宣言とは仲良くない」的なことだってのはわかってるんですが、「引数が何くるのかわからない状況ってのが怖くて、「え・・・string渡してくるバカがいたら死ぬの・・・？」みたいな気持ちになる。「string渡してくるやつがアホい」っていう思想なんだろうけど。

## まとめ

なんか他にもいろいろあったと思うんですけど、思い出した範囲で感じた違和感をかきました。

別にRubyをディスってるわけじゃなくて「全然Rubyの世界観に馴染めてない俺」っていう感じです。

ワンライナー書いたりとかRspecのDSL感とか、書いててシックリくることも多いのですが、なんかやっぱ型システム周りの思想の違いは大きいなぁと思ってます。
ダックタイピングって誰得なのかがまだわかってないので、しっくりくる日を待ち望んでます。

かしこ