2013-07-19 4 views
5

Почему существует разница в возвращаемых значениях F и G в следующем коде?Возврат результата вызова функции с/без круглых скобок

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] 

Насколько я понимаю, если функция возвращает какой-то пустой коллекции, PowerShell будет «разворачивать» его в нуль, и поэтому F делает то, что я ожидал. Но что происходит с G?

Редактировать: Как указано в JPBlanc, только PowerShell 3.0 демонстрирует эту разницу. В 2.0 обе строки печатают null. Что изменилось?

ответ

3

Извините, я не правильно прочитал ваш вопрос, так как F - это функция, которую вы используете() для оценки функции. Итак, результат функции Write-Type для меня в PowerShell V2.0.

Итак, в PowerShell 3.0 я отвечаю вашей проблемой.

Теперь с помощью:

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

Versus

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

насколько я понимаю() перед перед возвратом объекта генерировать следующие

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

Не могли бы вы объяснить? –

+0

Я не верю, что это правильно. В 'Write-Type F',' F' будет интерпретироваться как строка '' F '', что не то, что я хочу. – ahihi

+0

не совсем, @JPBlanc на самом деле прав, вы не должны указывать аргументы функции внутри скобок. Однако я не мог найти объяснения, почему. возрастной дизайн или скобки делает что-то особенное. Для того, чтобы F считался строкой, вы должны были бы окружить ее кавычками. Таким образом, F является объектом, а «F» - строкой. –

0

Когда речь идет о функции Powershell , то, что делает «возврат», выходит из функции раньше.

Я проверил книгу Брюса П «Powershell в действии» Страница 262, он говорит:

«Так почему же тогда Powershell нужен оператор возврата Ответ, управление потоком Иногда вы хотите выйти?. . функция рано Без возвращения заявления, вы должны были бы писать сложные условные операторы, чтобы получить контроль над потоком, чтобы добраться до конца ...»

Также Кит Хилл имеет очень хороший блог говорить об этом: http://rkeithhill.wordpress.com/2007/09/16/effective-powershell-item-7-understanding-output/

"......" return $ Proc "делает не означает, что только выходные функции являются содержимым переменной $ Proc. На самом деле эта конструкция семантически эквивалентна «$ Proc; return». .....»

Исходя из этого, если вы измените код функции, как это, выходной сценарий одинаков:

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

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

Это поведение отличается от традиционного языка, так что вызывают некоторые неурядицы

+1

Как указано в моем комментарии к ответу C.B., проблема не связана с ключевым словом 'return'. Это проблема, которая, по-видимому, была представлена ​​с PowerShell v3. –

+0

Спасибо Ansgar. Я не видел скрытый комментарий, когда вы разместили это. – Peter

Смежные вопросы