Hatena::Groupnadesiko

そっとなでしこ RSSフィード


メインのブログに書くまでもない、なでしこ学習帳【記事一覧】 【このブログは何?】


特設!→【目次】なでしこ用Twitter 連携ライブラリ「なこったー」で遊ぶ


2010-06-21

グループのミックスで、予想外の動作が

| グループのミックスで、予想外の動作が - そっとなでしこ を含むブックマーク はてなブックマーク - グループのミックスで、予想外の動作が - そっとなでしこ

グループを宣言するとき、他のグループをミックスすることができます。オブジェクト指向で言えば継承に当たりますが、それほど高度な機能ではなく、ただ単に、グループ内の項目をコピーしているだけです。グループ内に変数名の衝突があれば上書きしてしまいます。

グループ分け(オブジェクト指向ライク)|日本語プログラミング言語「なでしこ」

で、次のようなサンプルコードを書いてみた所、自分の予想とは違った動きが。

■ソースコード

つぶやきとはHatenaハイク。
「{つぶやき→サービス名}」を言う。   #予想通り「はてなハイク」と言う
つぶやき→サービス名表示。        #予想通り「はてなハイク」と言う
つぶやき→概要表示。           #予想外に「ツイッター」と言う

#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■ツイッターとは
  ・サービス名
  ・作る~
    サービス名は「ツイッター」
  ・サービス名表示~
    「ツイッター」と言う。
  ・概要表示~
    サービス名表示。
#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
  ・サービス名表示~
    「はてなハイク」と言う。

■「つぶやき→概要表示」が予想外の動きを

 上のサンプルでは、「ツイッター」グループをミックスする形で「Hatenaハイク」グループを定義しています。そうすることで、2つのグループで共通する部分は、「Hatenaハイク」グループでは省略しようという魂胆です。

 で、「Hatenaハイク」グループでは、「概要表示」というグループ内関数を省略しています。ですから、「Hatenaハイク」グループの「概要表示」を呼ぶと、ミックスした「ツイッター」グループの「概要表示」が呼ばれます。

 それは意図通りなのですが、この時、「概要表示」から呼ばれるグループ内関数「サービス名表示」は、「Hatenaハイク」グループで定義された「サービス名表示」が呼ばれるものと思っていました。ところが動かしてみると、予想に反して「ツイッター」グループの「サービス名表示」が呼ばれました。

■グループ内で自分自身を表す「自身」変数を使え

 どうも調べてみると、自分が意図したような動きをさせるためには、「ツイッター」グループの「概要表示」の定義を次のように記述しなければならないようです。

  ・概要表示~
    自身→サービス名表示。

 このようにして、生成されたインスタンスそれ自身の「サービス名表示」を呼び出すのだと明示することで、「Hatenaハイク」グループで呼ばれた「概要表示」は、「Hatenaハイク」グループの「サービス名表示」を呼び出すようになりました。

グループ内で自分自身を指定したい場合があります。そのときは、『自身』変数を使います。『自身』は常にグループ内で自分自身のインスタンスへのエイリアス変数です。『自身』は動的に設定されていますので、自身のメンバへアクセスするときは、『自身→メンバ名』または『自身@「メンバ名」』の形式で指定します。

グループ分け(オブジェクト指向ライク)|日本語プログラミング言語「なでしこ」

 なるほど~