読者です 読者をやめる 読者になる 読者になる

MogLog

メモというか日記というか備忘録というか

【Ruby】メソッド呼び出し

メソッド呼び出し
メソッド呼び出し式は4つの部分から構成される。

(1) メソッドの呼び出し元のオブジェクト評価される任意の式。この式の後ろには、メソッド名とオブジェクト名を区切るための「.」または「::」が続く。
(2) 呼び出されるメソッドの名前。呼び出し式の中で唯一必須な部分
(3) メソッドに渡される引数値。引数の数と型は、メソッド定義によって決まる。
(4) 中括弧か、do/endペアで囲まれた省略可能なコードブロック。

# メソッド呼び出しの例
puts "hello,world" # 1個の文字列引数を与えて、selfのputsを起動
Math.sqrt(2) # 1個の引数を与えて、Mathオブジェクトのsqrtを起動
message.length # 引数なしで、messageオブジェクトのlengthを起動
a.each{|x| puts x} # 付属ブロックを指定してaオブジェクトのeachを起動

# 「.」と「::」のどちらでも利用できる
ary = [2,4,1,3] # => [2, 4, 1, 3]
ary.sort #=> [1, 2, 3, 4]
ary::sort #=> [1, 2, 3, 4]


○ 「message.length」という1文について考察する
messageオブジェクトのlength変数の値を参照する変数参照式だと思いたくなるが、そうではない。
Rubyオブジェクトは内部インスタンス変数をいくつでもカプセル化できるが、外の世界に差し出すのはメソッドだけなのである。
lengthメソッドは引数を取らず、カッコも省略して呼び出されているので、変数参照のように見えるが、実際、これは意図的なもの。この種のメソッドは属性アクセサメソッドと呼ばれ、messageオブジェクトはlength属性を持っているという言い方をする。


○「a[0]」という1文について考察する
変数aは配列を格納しているものとして考える。
これも特殊な変数参照式のように見えるかもしれない。
今度は変数が配列要素になっているのである。
しかし、これも本当はメソッド呼び出しである。Rubyインタプリタは配列アクセスを次のように変換する。

a.(0)

配列アクセスは、配列のという名前のメソッドの呼び出しコードになり、配列の添字がその引数となる。この配列アクセス構文を使えるのは、配列だけではない。全てのオブジェクトが[]という名のメソッドを定義できる。
角カッコの中に添字(引数ではない)が含まれて言える場合、メソッドには角カッコ内の値が引数として与えられる。


○「x」という1文について考察する
xという名前の変数が存在するなら(つまり、Rubyインタプリタがxに対する代入を検出していれば)、これは変数参照式となる。そのような変数がなければ、これは「引数なしでselfのxメソッドを呼び出す」という意味になる。


※式とは
Rubyインタープリタが評価して値を生成できるようなRubyコードの塊のこと。以下、式の例。
2 # 数値リテラル
x # ローカル変数参照
Math.sqrt(2) # メソッド呼び出し
x = Math.sqrt(2) # 代入
x*x # *演算子による乗算