組み込みクラス
BasicObjectクラス
- Objectクラスのスーパークラス
- Objectクラスでは定義されているメソッドが多すぎる場合など特殊な用途の為のクラス
- 存在してると記憶しておけばよす
Objectクラス
- 全てのクラスのスーパークラス
- Kernelモジュールをインクルードしている為、全てのクラスでKernelモジュールのメソッドが使用できる
オブジェクトのID
- オブジェクト毎に割り当てられた重複しない値(整数)を取得できる
- Kernel#object_id
object_id
#=> 70101064135100
1.object_id
#=> 3
'a'.object_id
#=> 70101068557740
- 当然ながら、オブジェクトのIDは同じオブジェクトであれば同じ整数となる
- Rubyでは全てがオブジェクトなので同じリテラルであってもオブジェクトIDは異なる
- TrueClass, FalseClass, NilClass, Synbol, Fixnum(Integer)クラスのインスタンスは同じオブジェクトを指すようになっている為、同じオブジェクトIDになる
1.object_id
#=> 3
1.object_id
#=> 3
true.object_id
#=> 20
true.object_id
#=> 20
:a.object_id
#=> 735708
:a.object_id
#=> 735708
'a'.object_id
#=> 70101068360700
'a'.object_id
#=> 70101068344640
オブジェクトのクラス
オブジェクトが何のクラスから生成されたのかを調べるには
'a'.class
#=> String
:a.class
#=> Symbol
オブジェクトの比較
equal? | オブジェクトIDの比較 |
eql? | ハッシュキーの比較 (1.hash => -1838658016341557374) |
== | クラスにより何を持って同じとするのか異なるのでクラスによって再定義される |
=== | クラスにより何を持って同じとするのか異なるのでクラスによって再定義される |
例えば、String#== は eql? と同じ結果を返す
1.equal?(1)
=> true
'a'.equal?('a')
=> false
1.eql?(1)
=> true
'a'.eql?('a')
=> true
オブジェクトのメソッド一覧
通常は継承したメソッドも表示されるが、引数にfalseを渡すと(継承, extend, include)したメソッドは表示されなくなる (methodsは特異メソッドのみになるらしい?)
methods | 呼び出し可能(public, protected, singleton)なメソッドの一覧 |
private_methods | プライベートメソッドの一覧 |
protected_methods | プロテクテッドメソッドの一覧 |
public_methods | パブリックメソッドの一覧 |
singleton_methods | 特異メソッドの一覧 |
オブジェクトの複製
シャローコピーしたほぼ同じオブジェクトを複製する
dup | 汚染状態、インスタンス変数、ファイナライザも複製する |
clone | 汚染状態、インスタンス変数、ファイナライザ、凍結状態、特異メソッドも複製する |
インスタンス変数に外部からアクセスする
instance_variables | インスタンス変数の一覧を取得 |
instance_variable_set | インスタンス変数の設定 |
instance_variable_get | インスタンス変数の取得 |
class Moko
end
moko = Moko.new
moko.instance_variables
#=> []
moko.instance_variable_get(:@homo)
#=> nil
moko.instance_variable_set(:@homo, true)
moko.instance_variable_get(:@homo)
#=> true
moko.instance_variables
#=> [:@homo]
moko.instance_variable_get('@homo') # 文字列でもいいらしい
#=> true
未定義メソッドの呼び出し
method_missing の辺りを参照してね
オブジェクトの文字列表現
オブジェクトの文字列表現には to_s, inspectメソッドを使いますが、オブジェクトによってどのような文字列にすればよいのかは千差万別であり、それぞれのクラスで定義し直されています、あなたが作ったクラスでも定義すべきかと思います
to_s | 文字列表現を返す |
inspect | 人間が読める形の文字列表現を返す |
特別なオブジェクト
[true, false, nil] はそれぞれ [TrueClass, FalseClass, NilClass] クラスのオブジェクトであり、唯一のインスタンスとなります