Non capisco completamente la domanda, ma qui c'è un po 'di spiegazione. require
ha una versione sovraccarico in Predef
:
def require(requirement: Boolean) //...
def require(requirement: Boolean, message: => Any) //...
Il secondo è un po 'di confusione a causa message: => Any
tipo. Probabilmente sarebbe più facile se si trattava semplicemente:
def require(requirement: Boolean, message: Any) //...
Il secondo parametro è, naturalmente, un messaggio che è supponiamo di essere allegata al messaggio di errore se le affermazioni non sono soddisfatti. Si potrebbe immaginare message
dovrebbe essere di tipo String
ma con Any
si può semplicemente scrivere:
require(x == 4, x)
che aggiungerà valore reale della x
(di tipo Int
) in un messaggio di errore se non è uguale a 4
. Ecco perché è stato scelto Any
- per consentire un valore arbitrario.
Ma per quanto riguarda la parte : =>
? Si chiama chiama per nome e in pratica significa: valuta questo parametro quando si accede a. Immaginate il seguente frammento:
require(list.isEmpty, list.size)
In questo caso si vuole essere sicuri che il list
è vuoto - e se non lo è, aggiungere il list
dimensioni reali al messaggio di errore. Tuttavia, con la normale convenzione di chiamata, la parte list.size
deve essere valutata prima del, il metodo viene chiamato, il che potrebbe essere uno spreco.Con chiama per nome la convenzione list.size
viene valutata solo la prima volta che viene utilizzata, quando il messaggio di errore è costruttore (se necessario).
fonte
2012-05-20 11:50:23
Cosa c'è che non va nella definizione? '" foo "==" bar "' è un valore 'Boolean' e un' String' è conforme a 'Any' (come fa _any_ type). – Tharabas
La domanda è, perché una stringa è un tipo valido per il secondo argomento mentre le firme dicono che deve essere una funzione 'message: => Any' –