書籍Getting Started with Grails - 2eの 42 ページ (紙のページではなく電子ページ) に、次の例がリストされています。
class Race {
static constraints = {
name(blank:false, maxSize:50)
// NOTE: This doesn’t do
// what you think it does
startDate(min: new Date())
// And this is what we're supposed
// to be using:
// startDate(validator: {return (it > new Date())})
}
String name
Date startDate
// ...
}
読者は、startDate
上記のコメントアウトされたバージョンを使用することをお勧めします。引用された理由は次のとおりです。static constraints
プロパティは(サーバーの起動時に)一度だけ評価されますが、私たちの意図は、インスタンス化とその後の検証のたびに評価されるようにすることですRace
。
私の質問は次のとおりです。なぜ、制約の非閉鎖スタイルがname
各検証試行で機能するのに、制約では機能しないのstartDate
ですか? 逆に、クロージャー フレーバーが に必要な場合startDate
、なぜ にも必要でないのname
でしょうか?
上記の Groovy 構文を正しく理解していれば、static constraint
ブロックにリストされている各制約は、構文的には、さまざまな検証属性を として受け取る関数の呼び出しであるように見えますMap
。静的ブロックはサーバーの起動時に (1 回) 評価されるため、両方の関数呼び出しもサーバーの起動時に (1 回) 発生し、非閉鎖形式で同一の一貫した動作につながるはずです。そうじゃない?