たぶん忘れるメモ

記憶力はないのです。

PHP使いがRubyを触ったとき

仕事でRailsを数ヶ月使ったので、覚え書き。色々思ったことはあったんだけど結構忘れてしまいました。
Railsの機能を殆ど使ってない気がするのでRubyだけで。CakePHPやってると違和感少ないこともないこともないかもしれないです。結構違うと思いました。

便利と思った点

each_with_index の存在

forの必要性を疑問に思ったほど。for 文では減算ループできないので(減算は downto を使う)。
PHPの foreach と違って、前のループで途中で出ていてもリセット不要でちゃんと先頭からループされる。素敵。
配列やハッシュに関しては回し方に色々な方法があるので、最初は「こうやればよかった!」と思うことが頻繁でした。

Array#map、Array#select

ダミーの変数を用意して入れ替えるとかそんなのが必要なくなる素敵! こういうふうにソースを綺麗にシンプルに書けるという点ではRuby凄いと思います。
return false if hoge.nil?
とかね。(変数hogeがnilだったらfalseを返す、という意味)

シンボルの存在

文字列ではないので、ソースが安定するような気がします。気がするだけかも。
文字列とシンボルを変換できる String#intern を見つけてからは多用しまくりです。


あとは、Rails の blank? が便利だと思いました。ifがシンプルになるので。なんで フレームワークの機能なんだろう。
配列ハッシュで何かうまくシンプルに書けないかなと思ったらリファレンスをチェックするといいと思います。Enumerable のメソッドが結構使えるもの多いです(Hash はこれの派生クラス)。


戸惑った点

for文の存在

最初は使っていたんですけど、減算できないと思って色々調べてみたらループ文が多種多様にありすぎて、この子の存在って一体…という気分に。
ただ、見知った構文があることで入門者へのハードルは低くなるので、なくなればいいとは思いません。

クラスの継承

Rubyではクラスの継承はあまりしないときいて、後で納得。
モジュール使えってことだと思います。Webアプリの場合は、きちんとしたクラスよりも共通関数群を用意してざっくりと書いてしまった方が開発効率がいいような気がするので、慣れてしまうと楽に感じました。

クラスメソッドのアクセス制限

publicとかprivateとか、宣言じゃないよ。メソッドだよ!
書いてしまったらそれ以降すべてそのアクセス制限になるので、関数ごとに書き換えても意味をなしません。最初わからなくてずっとはまってました。
個人的には private_class_method を使うほうがすっきりすると思います。

ないわーと思った点

object_idが予約語なこと

うん、そんなベタな名前使うなということなんでしょうけどね。__id__ だけでいいじゃない。
Rubyはあらゆるものがクラスなので true とか false とかでも object_id がおります。nil がクラスなんて!と言っている人がいらっしゃいますが、その道は既にDelphianが通った道です。

配列のインデックスがないところにアタッチしたときにエラーが出ない

nilが返ります。
エラー出そうよ…エラー出すところでしょ…。しばらくエラーに気がつかなくて、がっつりRSpec書いたあと気がつく。Rubyはテスト必須言語だと思いました。いえ、どの言語でも書くべきなんですけど!