Rubyのお勉強(その1)

1) "===" 演算子
php の "===" 演算子は型もチェックするより「厳密」な比較に対して、Rubyでは逆にクラスごとに異なる、より「緩い」比較。case文での比較は、"=="ではなく、"==="で比較される。より厳密な比較には eql? というのがある(?)

2) "equal?" メソッド
bool を返すメソッドはメソッド名に"?"をつけるのが「慣習」。instance.equal? はオブジェクトIDの同一性の比較。String の文字列内容の同一性の比較は "==" を使用。Java 使ってると混乱しそうなので注意。

3) 範囲オブジェクト
for i in from..to の "from..to" は「範囲オブジェクト」というオブジェクトが生成されている。ここに配列を入れると、php の foreach 的な使い方ができる。ただし、配列オブジェクトの eachメソッドを使うの方が良いかも。

4) クラスメソッドの呼び出し
Class.method と Class::method は全く同じもの。メソッド呼び出しに()は省略可能(全てのメソッド)。

5) 関数的メソッド(変な名前だ...w)
phpの組み込みグローバル関数的な使い方がされるもの。実際はレシーバーとなるオブジェクトは存在する。クラスの include は必要。(Name Space的な使い方?)

6) メソッドの定義
def で定義する。return 省略時は最後の参照値が渡される。この辺は perl 的。

7) 命名規則
ローカル変数は英小文字か"_"から始め、クラス名は英大文字から始める(言語レベルの制約)。グローバル変数は$、インスタンス変数(Javaのメンバー変数)は@、クラス変数(Javaのstaticメンバー変数)は@@。@も@@も変数宣言は不要。

8) クラス
コンストラクタの名前は initialize。インスタンス変数自体は全て private なのだが(宣言不要なので当然)、同名のアクセッサメソッドを持てる。

class A
  def a # getter
    return @a
  end
  def a=(value) # setter
    @a = value
  end
end

p instA.a
instA.a = "test"

アクセッサは、attr_reader, att_writer, attr_accessor で自動生成できる。良くできちょる!

class を複数に分けて書くことができる。これにより既存の class を拡張できる。

9) インスタンスメソッド
Javaのメンバー関数。こちらはpublic, private, protectedが使える。ただし、protectedの意味がJavaと違いかなり違い、継承(サブクラス)やパッケージは関係ない。ほぼ private と同じだが、クラス内でレシーバーを指定した呼び出しが出来るのが protedted。C++,Java,C#,Ruby 全部微妙に違う。なんとかしてくれぇ〜!
【参照】http://capsctrl.que.jp/kdmsnr/wiki/bliki/?AccessModifier

9) クラスメソッド
Javaのスタティックメンバー関数。3種類の書き方があるが、def self.func(value) がわかりよさそう。

10) クラス定数
Java のメンバー変数みたいに、Class内で普通に変数を初期化すると定数(Javaのfinal変数)になる。

11) 演算子のオーバーライド
C++ のように、[]演算子や、算術演算子などをオーバーライドできる。いいとこ取り!