leaning diary Rails

【Learning Diary28】Rubyの基本を理解する(instance_of?/writer/reader/accessor/self/undef etc)

04/11/2023

【Learning Diary28】Rubyの基本を理解する(instance_of?/writer/reader/accessor/self/undef etc)

今日は、昨日の続きを読み進めました。

配列を引数に展開する

メソッドに引数を渡す場合に、配列を展開してメソッドの引数にすることもできます。

 

メソッドの呼び出しの際に「*配列」 の形式で引数を指定すると、配列そのものではなく配列の要素が先頭から順にメソッドの引数として渡されます。

 

ただし、配列の要素の数とメソッドの要素の数は一致している必要があります。

どのクラスのインスタンスか調べる

あるオブジェクトがあるクラスのインスタンスかどうかを判断するには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のプログラムで共通して使用する関数的メソッドが実装されたモジュールの名前です。

-leaning diary, Rails
-