2013-07-19 8 views
5

Perché c'è una differenza nei valori di ritorno di F e G nel seguente codice?Restituzione del risultato di una chiamata di funzione con/senza parentesi

Function F { 
    Return (New-Object Collections.Generic.LinkedList[Object]) 
} 

Function G { 
    Return New-Object Collections.Generic.LinkedList[Object] 
} 

Function Write-Type($x) { 
    If($null -eq $x) { 
     Write-Host "null" 
    } Else { 
     Write-Host $x.GetType() 
    } 
} 

Write-Type (F) # -> null 
Write-Type (G) # -> System.Collections.Generic.LinkedList`1[System.Object] 

Per quanto ho capito, se una funzione restituisce una sorta di collezione vuota, PowerShell sarà "scartare" in nulla, e così F fa quello che mi aspetto. Ma cosa sta succedendo con G?

Modifica: come indicato da JPBlanc, solo PowerShell 3.0 presenta questa differenza. Nel 2.0, entrambe le linee stampano null. Cosa è cambiato?

risposta

3

Spiacente, non ho letto correttamente la tua domanda, poiché F è l'interfaccia che stai usando() per valutare la funzione. Quindi il risultato della funzione Write-Type è lo stesso per me in PowerShell V2.0.

Quindi, in PowerShell 3.0 ho riscontrato il problema.

Ora utilizzando:

Trace-Command -name TypeConversion -Expression {Write-Type (F)} -PSHost 

Versus

Trace-Command -name TypeConversion -Expression {Write-Type (G)} -PSHost 

per quanto ho capito il() prima di prima di ritornare oggetto genera il seguente

Converting "Collections.Generic.LinkedList" to "System.Type". 
    Conversion to System.Type 
     Conversion to System.Type 
      Could not find a match for "System.Collections.Generic.LinkedList". 
     Could not find a match for "Collections.Generic.LinkedList". 
Converting "Collections.Generic.LinkedList`1" to "System.Type". 
    Conversion to System.Type 
     Conversion to System.Type 
      Found "System.Collections.Generic.LinkedList`1[T]" in the loaded assemblies. 
Converting "Object" to "System.Type". 
    Conversion to System.Type 
     Conversion to System.Type 
      Found "System.Object" in the loaded assemblies. 
+0

Potresti spiegare per favore? –

+0

Non credo che sia corretto. In 'Write-Type F', il' F' sarà interpretato come la stringa '" F "', che non è quello che voglio. – ahihi

+0

non esattamente, @JPBlanc ha ragione, non dovresti inserire gli argomenti delle funzioni tra parentesi, ma non ho trovato la spiegazione del perché. il design o le parentesi dell'età fa qualcosa di speciale. Affinché F sia trattato come stringa, devi racchiuderlo tra virgolette. Quindi F è un oggetto e "F" è una stringa. –

0

Quando si tratta di funzioni PowerShell , ciò che "restituisce" sta uscendo dalla funzione in anticipo.

ho controllato il libro di Bruce P "PowerShell in azione" pagina 262, si dice:

"Allora, perché, allora, PowerShell bisogno di una dichiarazione di ritorno La risposta è, il controllo di flusso A volte si vuole uscire?. . una funzione presto senza una dichiarazione di ritorno, dovreste scrivere istruzioni condizionali complesse per ottenere il controllo di flusso per raggiungere la fine ..."

anche Keith Hill ha un ottimo blog a parlare di questo: http://rkeithhill.wordpress.com/2007/09/16/effective-powershell-item-7-understanding-output/

"......" ritorno $ Proc "fa non significa che l'output delle sole funzioni è il contenuto della variabile $ Proc. In realtà questo costrutto è semanticamente equivalente a "$ Proc; return". ....."

Sulla base di questo, se si modifica il codice funzione come questa, l'output dello script sono gli stessi:

Function F { 
    (New-Object Collections.Generic.LinkedList[Object]) 
    Return 
} 

Function G { 
    New-Object Collections.Generic.LinkedList[Object] 
    Return 
} 

Questo comportamento è diverso da quello tradizionale linguaggio in modo che provoca alcune confusioni

+1

Come indicato nel mio commento alla risposta di C.B., il problema non è correlato alla parola chiave 'return'. È un problema apparentemente introdotto con PowerShell v3. –

+0

Grazie Ansgar. Non ho visto il commento nascosto quando ho postato questo. – Peter

Problemi correlati