みなさん こんにちは。
このコースでは yourself メソッドについて学びます。
役に立たなさそうに見えますが とても有用なメソッドです。
練習問題から始めましょう。
この表現式 Set new add: 2 を見てください。
値 2 を含む集合が欲しいのですが
この表現式は値 2 だけを返します。
どうして値 2 が得られるのでしょう？ 2 を含む集合ではなく。
Set クラスに実装されている add: メソッドを見れば
そのメソッドが引数を返り値として返す ことがわかるでしょう。
表現式 Set new add: 2 では
表現式 Set は Set クラスを返します。
Set クラスに new を送ると 新しい集合が返ってきます。
Set new add: 2 は
add: 2 の返り値を返します。 つまり、2 です。
集合のほうは得られません。
この問題を解決するには
表現式をステップごとに分割して書くことができます。
一時変数をつくります。 変数 s を宣言します。
新しい集合を s に代入します。
s に 2 を追加(add:)します。
これで s は値 2 を含む集合を保持します。
これが欲しかったものです。
これらの表現式を
yourself メソッドを使って簡潔にできます。
yourself メソッドの中身を見ると
たった1つのことしかしません。 self を返すだけです。
self を返すことはメソッドのデフォルトなので省略可能です。 このメソッドは空でも良いのです。
何もしないのです。 レシーバーを返り値とすることを除いて。
このメソッドはそのレシーバーを返すだけですが
それでも有用です。
オペレーターカスケードを使うことで。
2 を追加した後で
yourself メソッドを実行しましょう。
するとレシーバーが返ってきます。
つまり表現式全体の値がレシーバーになります。
つまりこの新しい集合です。
Set new として
新しい集合を手にして
add: 2 を Set new に適用すると
2 が返ってきます。
しかしオペレーターカスケードを使って yourself と続けることで
表現式全体はこの新しい集合を返します。
なぜ？
カスケードは最後の表現式が返した値を返す 仕掛けになっています。
このカスケードは
yourself が返す値を返します。
yourself はよくカスケードと一緒に
インスタンス生成のメソッドで使われます。
クラスに送られるメッセージに対応する
クラスメソッドで
新しいインスタンスを返します。
新しい Set を
ある要素を予め含めて生成する時には
Set に with: anObject メッセージを 送ります。
このコードは新しい集合を作って
変数 instance に格納して
引数を instance に追加して
instance を返り値とします。
この式全体を yourself を使って
より短く、より慣用句的に書くことができます。
このコードは Pharo ではよくあるものです。
セミコロン、つまりカスケードと yourselfを
習得することはとても大切です。
このコースを終わるにあたって 次のことを覚えておいてください。
メソッドの中には とてもシンプルでありながら
とてもパワフルで頻繁に使われるものが あります。
カスケード、つまりセミコロンと yourself メソッドは
とても頻繁に組み合わせられて使われます。
カスケードと yourself を使うことで 式全体の値が期待したものであることを
確実にすることができます。