###Rubyにおけるクラス
Rubyではあらゆるものがオブジェクト
この節では実際にオブジェクトをいくつか定義してみる。
メソッドをまとめるのにクラスを使っています
クラスからインスタンスが生成されることでオブジェクトが作成
####コンストラクタ
これまで示した多くの例の中でも、クラスを使ってオブジェクトのインスタンスを作成してきたのです。
例えばダブルクォートを使って文字列のインスタンスを作成しました。
これは文字列のオブジェクトを暗黙で作成
するリテラルコンストラクタです。
>> s = "foobar" # ダブルクォートは実は文字列のコンストラクタ
=> "foobar"
>> s.class
=> String
文字列がclassメソッドに応答しており、その文字列が所属するクラスを単に返している。
明示的に同等の名前付きコンストラクタを使う。
名前付きコンストラクタは、クラス名に対してnewメソッド
を呼び出す。
>> s = String.new("foobar") # 文字列の名前付きコンストラクタ
=> "foobar"
>> s.class
=> String
>> s == "foobar"
=> true
リテラルコンストラクタと等価ですが、動作の内容が明確に示されています
配列でも、文字列と同様にインスタンスを生成できます
。
>> a = Array.new([1, 3, 2])
=> [1, 3, 2]
ハッシュの場合は若干異なる。
Array.new は配列の初期値を引数に取りますが、
Hash.new はハッシュのデフォルト 値を引数に取る。
これは、キーが存在しない場合のデフォルト値です。
>> h = Hash.new
=> {}
>> h[:foo] # 存在しないキー (:foo) の値にアクセスしてみる
=> nil
>> h = Hash.new(0) # 存在しないキーのデフォルト値をnilから0にする
=> {}
>> h[:foo]
=> 0
メソッドがクラス自身に対して呼び出されるとき、このメソッドをクラスメソッド
クラスのnewメソッドを呼び出した結果は、そのクラスのオブジェクトであり、これはクラスのインスタンスとも呼ぶ。
lengthのように、インスタンスに対して呼び出すメソッドはインスタンスメソッドと呼ぶ。
####演習
1.リテラルコンストラクタとは?
隠れてインスタンスを作成
newメソッドを使わずインスタンスを作成すること
かな。
2.Rangeクラスとnewメソッドを使って、1から10の範囲オブジェクトを作れ。
>> Range.new(1,10)
=> 1..10
3.比較演算子==を使って、上記2つの課題で作ったそれぞれのオブジェクトが同じであることを確認しろ。
a = Range.new(1,10)
=> 1..10
>> b = 1..10
=> 1..10
>> a == b
=> true