C言語でヘッダファイルを何度も読み込まないためのテクニック。あれの Play!テンプレート版です。
C言語の場合は下記のように記述しますよね。
#ifndef _mylib_h_
#define _mylib_h_
/* 本文 */
#endif
“mylib_h” が未定義ならヘッダの /* 本文 */ を読み込み、定義済なら無視するという仕組みです。
これをPlay!のテンプレートエンジンで実現しようとすると下記のようになります。
get/setで実現する
#{get '_mylib_h_'}
<!-- 本文 -->
#{/get}
#{set _mylib_h_:'' /}
頭の部分で #{get}
で "mylib_h"
という変数の出力を試みます。#{get}
の挙動として指定の変数が未定義のときはタグで挟まれた <!-- 本文 -->
が出力されます。
その後、#{set}
で "mylib_h"
変数を定義しつつ、中身を空にしておきます。
こうすることで次の読込では、変数 "mylib_h"
は定義済と判断されるのでタグで囲まれた部分ではなく変数の中身が出力されます。
しかし変数の中身は空っぽなので何も出力されないことになります。
一時的にですが本文の内容が変数 "mylib_h"
に設定されることになります。それが気になるのであれば次の方法で。
ifnot/setで実現する
素直にifnot
で実現すると下記のようになります。
#{ifnot _mylib_h_}
#{set _mylib_h_:'defined' /}
<!-- 本文 -->
#{/ifnot}
変数"mylib_h"
に設定する値は何でもいいですが、空文字だとダメなので何かしら設定する必要があります。