プログラミング言語論第5回補足
補足2(メソッドの呼び出し方)


- 標準的には オブジェクト名 . メソッド名
- (そのうしろに 引数(括弧で囲んでもいい)がつく ことがある。
また、ブロックがつくものもある)
- リファレンスの メソッドのリストの 上のほうにあるもので、
self を含む文法が書かれているものでは、
例えば self * x
と書かれていれば
self のところに そのオブジェクト(を値として持つ式や変数)を置く 
- オブジェクト指向の考え方の根本に、オブジェクトに対して
(処理やデータを要求する)メッセージを「送る」という考え方がある(右図)。
その考え方に沿って、ピリオド ‘.’ の左側のオブジェクトを
「レシーバ」と呼ぶこともある。

- オブジェクトにメソッドを適用した結果がまた何かのオブジェクトを返すので、
さらにそのオブジェクトにメソッドを適用することで、メソッド呼出の連鎖
を形成することができる(メソッドチェーンと呼ぶ)。
補足2.1(メソッドチェーンについて)

メソッドチェーンは、文法的には「左結合」である(上図)。つまり、 
- abc.def.ghi.jkl と書いたものは、((abc.def).ghi).jkl
と解釈される
- 数式 10+20-30+40 が (((10+20)-30)+40 と解釈されるのと同じルール
- abc.(def.(ghi.jkl)) という解釈にはならない
(このように解釈されるためには 括弧を省略せずに使う必要がある)
- もちろん、チェーンにしてつながずに下のように1ステップずつ変数に代入して受け渡す
プログラミングスタイルもある
- (デバッグする際の利点はあるが
その反面、プログラムの簡潔性を損なう危険性もある)

改行文字
補足3(行末の改行記号について)
- アスキー符号表を参照されたし
- コンピュータに保存されている状態では
OSによって改行文字の扱いが違うが、
ruby では Unixの流儀に準じて NL (0x0a) 1文字が使われる
- irb で gets
を入力(すると一行の入力待ちになるので何か入れる)してみる
または p gets
=> 表示される文字列(””で囲まれている)の末尾に
が挟まっているのがそれ
- ASCIIの CR (これで一文字相当) LF (これも1文字)
- windowsでは2文字で改行を表しているが、
rubyプログラムでは1文字だと考えて扱うことが多い
- ちなみに(余談だが)まな板」は英語で chopping board などと呼ぶ。
動詞 chop のイメージを確認されたし(karate chop
も英語として定着している)。
- また、CR(キャリッジ・リターン)
LF(ライン・フィード)は、タイプライター(コンピュータの
キーボードの原型になった)のキャリッジの動作に由来する(下図右)

補足4(継承について)
- Stringクラスに属するオブジェクトに対して、Stringクラスで定義されたメソッドを使うことができる(というのをこれまで見てきた)。
- それ以外に、Stringクラスのオブジェクトは、その親クラス(を含む、継承リストにある
クラスやモジュール)で定義されたメソッドも使うことができる。
- 親クラスで定義されたものを子クラスで使うことができる、この関係を「継承」と呼ぶ。
- 例えば、
- “abcde”.class => String
これは、Stringクラス(に属するオブジェクトである 文字列
“abcde”)に対して、Stringの親から継承した Object#class
メソッドを呼んだ場面。
- “abc” > “def” => false これは Stringクラスが継承しているComparableモジュール
にあるメソッド Comparable#>
を呼んだ場面(文法的に演算子の形をしているがこれもメソッドの一種である)
補足5(メソッドの動作)
破壊的
- 今日見てきた String#chop String#reverse
などの文字列を加工するメソッドは、正確に言えば
文字列を変形した新しいStringオブジェクトを生成する
メソッドであり、
レシーバ(もとのオブジェクト)に直接変更を施すものではない
- これらのメソッド呼び出し後も、もとのオブジェクトはメソッド適用前と同じ値で残っている。
- ただしもとのオブジェクトに変更を加えるメソッドも部分的にはあり、「破壊的メソッド」などと分類されている
- 破壊的メソッドの多くはメソッド名の最後の文字が !
になっている(それ以外の破壊的メソッドもあるが追々紹介していくことにする)