hellolift学習ノート(2)


3.メニュー
indexを除いてページに表示されます.htmlから出力される内容のほかに、ページに操作メニューがありますが、このメニューはどのように形成されていますか?
ここでhtmlには
<lift:Menu.builder/>

これはまたsnippetの運用ですが、liftに内蔵されたsnippetです.このclassはlift-webkitパッケージの中で見つけることができます.ソースコードはliftsrcmainscalaetliftwebbuiltinsnippetMenuにあります.class、多くのlift内蔵のsnippetはここで見つけることができますが、surroundを見てbindを見ていません.
MenuのbuilderメソッドはLiftRulesから.SiteMapではmenuの内容が得られ、siteMapの定義はBoot.scalaでは、以下のように行います.

    // Build SiteMap
    val entries = Menu(Loc("Home", List("index"), "Home")) ::
    Menu(Loc("Request Details", List("request"), "Request Details")) ::
    User.sitemap ::: Entry.sitemap
    LiftRules.setSiteMap(SiteMap(entries:_*))

Loc("Home", List("index"), "Home")

名前、リンク、メニュー表示のテキストの3つのパラメータを定義し、2番目のパラメータはweb contextのURIに対して'/'で分割された配列である.
Menuの構造は以下の通りです

case class Menu(val loc : Loc[Any], val kids : Menu*) 
 extends HasKids with Product

ここだSitemapとEntry.sitemapは2つのList[Menu]であり,それぞれに関連するメニュー項目を定義している.Entry.sitemapはhelloliftsrcmainscalacomhelloliftmodelEntry.scalaで定義、Uesr.sitemapは、継承されたMetaMegaProtoUser(lift-mappersrcmainscalaetliftwebmapperProtoUser.scalaにある)の内容を定義してからよく勉強します.
二つのMenu,二つのList[Menu]がentriesという新しいList[Menu]を構成する
最後の一言を見てみましょう
SiteMapの実装における定義は

 def apply(kids: Menu *)

定義中の*はRepeated parameters構文であり、最後のパラメータが繰り返し可能であることを示す(『The Definitive Guide To Lift』ch 8.8参照)
entries:_* 変数entriesの各要素をパラメータとして関数に渡すことを表し、変数をパラメータとして渡すのではなく
ここでSiteMap(entries:*)は、object SiteMap.apply()メソッドの呼び出しSiteMapオブジェクトを構築し、呼び出し
LiftRules.setSiteMapメソッドの後,ここで定義したHome,Request Details,User,Entryのmodelで作成したそれぞれのメニューを含むシステムメニューの作成を完了した.
(ここで疑問ですが、ソースコードから見ると、SiteMapの定義はこうです
case class SiteMap(globalParamFuncs: List[PartialFunction[Box[Req], Loc.LocParam]], kids: Menu*) extends HasKids 

しかしapiで見たコンストラクション関数には最初のパラメータがありません.これはどういうことですか.わかる方教えて欲しいです)