2018年2月8日木曜日

Hugoのテンプレいじった時に変数の再代入に悩んだ

ダンジョンマッピングツール Wziの特設サイトを作った時に、スタティックサイトジェネレーターHugoを使ったのですが、これ結構クセあるなぁと思いました。
変数への再代入で随分と悩みました。

スクリプトがGoベースとなっているので、変数の定義もGoっぽく、テンプレートの中では、以下のように書いていきます。
{{ $v := 123 }}
既に{{ }}が面倒な感じがしましたが、デザイン テンプレートをちょこちょこっといじって、自分の気にいるように調整しようと思ったぐらいなので我慢します。
因みに私はそれまでGoを使ったことは無かったのですが、今回の件もあってA Tour of Goをかじりました。Goについてはその程度の知識です。

それで、以下のようには書けないので随分と悩みました。
{{ $v := 123 }
{{ if eq $v 123 }}
  {{ $v = 0 }}  # <-ここでビルドエラーが出てしまう。
{{ end }}


if文の中で変数$vの値を参照することはできるのですが、再代入することはできませんでした。
これはGoの制限でもなさそうだし、何故できないのか分かりません。しかし代替手法として、Scratchという機能が用意されています。

Scratchを使うと、以下のようになります。
{{ $.Scratch.Set "v" 123 }}
{{ if eq ($.Scratch.Get "v") 123 }}
  {{ $.Scratch.Set "v" 0 }}
{{ end }}

<h1>{{ $.Scratch.Get "v" }}</h1>
いちいち、vの値を取得するのに助長になるので、
{{ $v := $.Scratch.Get "v" }}

<h1>{{ $v }}</h1>
とでもして、変数に入れてみたりして使ってます。

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...