= メソッド
== 概要
* 数値やクラス型と同様、メソッドもNodeというオブエジェクト型として扱います。
* 例えば、変数にメソッドを代入し、代入した変数をメソッドとして呼び出すことが可能です。
== メソッドの種類
* メソッドも、他の変数同様インスタンスメソッド、クラスメソッドの2種類が存在します。
* また、ローカル変数に相当するローカルメソッドは、厳密には存在しませんが、あとの章に記載されているパラメータ付きブロックをローカル変数に代入することで、ローカルメソッドとほぼ同等の動作を期待することができます。
* メソッドとの違いは、ブロック内部からそれが宣言されたスコープ内のローカル変数にアクセスが可能な点です。
=== インスタンスメソッド
==== 概要
* 特定オブジェクトのインスタンスに所属するメソッド。
* class宣言内で明示的な宣言が必要です。
* インスタンスメソッドには、識別子として有効で、同一型の変数、メソッドと重複しない名称を自由につけることが可能です。
==== インスタンスメソッドの宣言方法
* メソッドの宣言は以下のようになります。
{{{
class MyClass
def メソッド名( パラメータ1, パラメータ2, ... )
メソッドの実装
end
end
}}}
==== インスタンスメソッドの呼び出し方法
* メソッドの呼び出しは以下のようになります。
{{{
オブジェクト変数.@メソッド名( Argument1, Argument2, ... )
または
オブジェクト変数.メソッド名( Argument1, Argument2, ... )
}}}
* 自オブジェクトのインスタンスメソッドを呼び出す場合は以下のようになります。
{{{
this.@メソッド名( argument1, argument2, ... ) と記載します。
または
this.メソッド名( Argument1, Argument2, ... )
}}}
* this. は省略することができます。
=== クラスメソッド
* 特定オブジェクトの型に所属するメソッド。
* class宣言内で明示的な宣言が必要です。
* クラスメソッドには、識別子として有効で、同一型の変数、メソッドと重複しない名称を自由につけることが可能です。
==== クラスメソッドの宣言方法
* メソッドの宣言は以下のようになります。
{{{
class MyClass
def class.メソッド名( パラメータ1, パラメータ2, ... )
メソッドの実装
end
end
}}}
* クラス宣言の外部に記載されたメソッドはKernelクラスのクラスメソッドとして宣言されます。
* この場合のみ、def のあとに続く class. は省略可能です。
{{{
def メソッド名( パラメータ1, パラメータ2, ... )
メソッドの実装
end
}}}
==== クラスメソッドの呼び出し方法
* メソッドの呼び出しは以下のようになります。
{{{
クラス名.@@メソッド名( Argument1, Argument2, ... )
または
クラス名.メソッド名( Argument1, Argument2, ... )
}}}
* クラスメソッドの中から同一クラスのクラスメソッドを呼び出す場合のみ、クラス名を省略することができます。
{{{
@@メソッド名( argument1, argument2, ... ) と記載します。
または
メソッド名( Argument1, Argument2, ... )
}}}
=== メソッドの代入
* 冒頭でも記述しましたが、変数と同様メソッドもNode型のオブジェクトとして定義されており、他の変数に再代入することが可能です。
{{{
class C0
@value = 10
def m1( )
Console.println( @value )
end
def m2( )
return @m1
end
end
p = C0.new( )
Console.println( p.@m1 ) # => #<Node:instance>
p.@m2 = 0 # => エラー:メソッドはコンパイル時にfinal属性が付加されます。
# したがって、メソッド変数に値を再代入することはできません。
m = p.@m2
p.@value = 20
m( ) # => 20
# p.m2( ) と同等
}}}
=== 可変引数
* この項目は、表記仕様の検討中です。