Il punto esclamativo qui non è un operatore, è solo una parte del token della sintassi di istanziazione del modello esplicita (descritta in dettaglio here).
std.conv.to
(docs) è un modello di funzione per la conversione tra tipi arbitrari. È implementato interamente nella libreria e non ha alcun supporto speciale nella lingua. Ha un ambito più ampio e diverso rispetto all'operatore di cast.
Il modello to
accetta due tipi di parametri; un tipo "a" e un tipo "da", in questo ordine. Nell'esempio, il modello viene esplicitamente istanziato con il solo argomento tipo ushort
per il parametro "a" e un secondo argomento tipo string
(supponendo) dal primo parametro aviene automaticamente dedotto dall'argomento di funzione regolare passato al funzione (args[1]
) come parametro "from".
La funzione risultante utilizza un parametro stringa e restituisce un ushort analizzato da tale stringa o genera un'eccezione se non è riuscita. L'operatore di cast non tenterà questo tipo di conversione di alto livello.
Nota che se c'è più di un parametro modello esplicito, o che il parametro ha più di un gettone in esso (ushort
è un unico token parola chiave), è necessario avvolgere la lista dei parametri del modello tra parentesi:
ushort result;
result = to!(typeof(result))(args[1]);
In questo esempio, typeof
, (
, result
e )
sono quattro token separati e pertanto sono necessarie le parentesi.
per rispondere alla tua ultima domanda, il token !
è utilizzato anche per l'unario operatore not, estraneo a istanze di modello:
bool yes = true;
bool no = !yes; // 'no' is false
fonte
2011-12-24 10:22:27
grazie mille =] ottima risposta! – thwd
Sembra anche che! è più un cast lessicale, per esempio per! string (f) è valido per floating point f e cast (string) f - not. –
Vorrei sottolineare che tecnicamente parlando 'to! Ushort (val)' non è in realtà un cast. È una conversione che usa la funzione 'std.conv.to'. Viene controllato, ma se inizi a chiamarlo cast, rischi di creare confusione. La fusione viene eseguita solo con l'operatore del cast. –