今日は、昨日の続きを読み進めました。
配列を引数に展開する
メソッドに引数を渡す場合に、配列を展開してメソッドの引数にすることもできます。
メソッドの呼び出しの際に「*配列」 の形式で引数を指定すると、配列そのものではなく配列の要素が先頭から順にメソッドの引数として渡されます。
ただし、配列の要素の数とメソッドの要素の数は一致している必要があります。
どのクラスのインスタンスか調べる
あるオブジェクトがあるクラスのインスタンスかどうかを判断するにはinstance_of?
メソッドを使います。
> ary=[] => [] >> str="Hello world." => "Hello world." >> p ary.instance_of?(Array) true => true >> p str.instance_of?(String) true => true >> p ary.instance_of?(String) false => false >> p str.instance_of?(Array) false => false
writer/reader/accessor
■ライター(writer) /セッター(setter) インスタンス変数を設定するメソッド
■リーダー(reader) /ゲッター(getter)参照するメソッド
■アクセサー(accessor) /アクセスメソッド 上記2つをあわせたもの
レシーバ自身を参照self
インスタンスメソッドの中でメソッドのレシーバ自身を参照するにはselfという特別な変数を使います。
クラスメソッドの書き方
クラスメソッドはクラスそのもの(クラスオブジェクト)をレシーバとするメソッドです。
そのクラスに関連する操作のために使われます。
クラスメソッドは
class << クラス名 〜 end
という特殊なクラス定義の中にインスタンスメソッドの形式で定義します。
(この定義で書かれたメソッドを特異メソッドと言います。)
その他、以下のような書き方もあります。
class HelloWorld class << self def hello(name) puts "#{name}, said hello." end end end def HelloWorld.hello(name) puts "#{name}, said hello." end HelloWorld.hello("John") class HelloWorld def self.hello(name) puts "#{name} said hello." end end
メソッド呼び出しの制限
■public
メソッドをインスタンスメソッドとして使えるように公開する。
■private
メソッドをレシーバを指定して呼び出せないようにする。
(レシーバを省略した形式でしか呼べないため、インスタンスの外側から利用できなくなる。)
■protected
メソッドを同一のクラスであればインスタンスメソッドとして使えるようにする。
initializeメソッドだけは特別で、publicのエリアに欠かれたとしても常にprivateとして定義されます。
undef
定義されたメソッドをなかったことにしたいときに使います。
undef メソッド名 #メソッド名をそのまま書いた場合
undef :メソッド名 #シンボルを使った場合
スーパークラスで提供するメソッドをサブクラスでは削除したいといった際に活用できます。
クラスの継承関係
■ancestorsメソッド 継承関係にあるクラスの一覧を取得できます。
■superclassメソッド 直接のスーパークラスを返却します。
Kernelとは
Rubyのプログラムで共通して使用する関数的メソッドが実装されたモジュールの名前です。