私はその質問を完全には理解していませんが、ここに少し説明があります。require
にオーバーロードされたバージョンが1つありPredef
ます:
def require(requirement: Boolean) //...
def require(requirement: Boolean, message: => Any) //...
2つ目は、タイプが原因で少し混乱しmessage: => Any
ます。それが単純であるならば、それはおそらくより簡単でしょう:
def require(requirement: Boolean, message: Any) //...
2番目のパラメーターはもちろん、アサーションが満たされない場合にエラーメッセージに追加されると想定されるメッセージです。あなたはタイプmessage
であるべきだと想像することができますが、あなたと一緒に簡単に書くことができます:String
Any
require(x == 4, x)
と等しくない場合、x
(タイプの)の実際の値がエラーメッセージに追加されます。そのため、任意の値を許可するために選択されました。Int
4
Any
しかし、: =>
一部はどうですか?これは名前による呼び出しと呼ばれ、基本的に次のことを意味します。アクセス時にこのパラメーターを評価します。次のスニペットを想像してみてください。
require(list.isEmpty, list.size)
この場合、が空であることを確認する必要があります。list
空でない場合は、実際のlist
サイズをエラーメッセージに追加します。ただし、通常の呼び出し規約では、メソッドを呼び出す前にlist.size
パーツを評価する必要があります。これは無駄になる可能性があります。名前による呼び出しの規則では、は最初に使用されたとき、つまりエラーメッセージがコンストラクターである場合にのみ評価されます(必要な場合)。list.size