Зачем нужна дополнительная пара кронштейнов? - PullRequest
6 голосов
/ 24 января 2012

Следующий скрипт powershell

"one","two","three" | % { "$(($l++)): $_" }

напечатает

1: one
2: two
3: three

Однако после снятия скобки вокруг $l++

"one","two","three" | % { "$($l++): $_" }

он напечатает

: one
: two
: three

Ответы [ 4 ]

12 голосов
/ 24 января 2012

Это потому, что $l++ является допустимым утверждением . В PowerShell определенные типы выражения, используемые в качестве операторов, не отображаются. Voidable операторы включают присваивания и операторы увеличения / уменьшения. Когда они используются в выражении, они возвращают значение, но когда они используются в качестве отдельного оператора, они не возвращают значение. Это очень хорошо объяснено в Windows Powershell в действии от Брюса Пайетта :

Операторы увеличения и уменьшения почти не были включены в PowerShell потому что они представили проблему. В таких языках, как C и C #, когда вы используете один из этих операторов как утверждение: $ А ++ ничего не отображается. Это связано с тем, что операторы в C и C # не возвращают значений. В PowerShell, однако, все операторы возвращают значение. Это привело к путанице. люди написал бы сценарии как это:

$sum=0
$i=0
while ($i -lt 10) { $sum += $i; $i++ }
$sum

и удивляйтесь, когда на экране появятся цифры от 1 до 10. Это было потому, что $ a ++ возвратил значение, и PowerShell отображал результаты каждого оператора. это было настолько запутанным, что мы почти удалили эти операторы из языка. Тогда мы натолкнулся на идею оспариваемого утверждения. В основном это означает, что определенные типы выражения, используемые в качестве операторов, не отображаются. Оспоримые заявления включают присваивания и операторы увеличения / уменьшения. Когда они используются в выражение, они возвращают значение, но когда они используются как самостоятельное утверждение, они не возвращать значение Опять же, это одна из тех деталей, которые не будут влиять на то, как вы используете PowerShell, кроме как заставить его работать так, как вы ожидаете. (источник: Windows Powershell в действии)

4 голосов
/ 24 января 2012

Я считаю, что это было дизайнерское решение, принятое командой PowerShell, чтобы избежать неожиданностей из-за вывода возвращаемых значений PowerShell.Многие C / C # люди ожидают, что следующая функция будет выводить только 1, а не @ (0,1).

function foo {
  $i = 0
  $i++
  $i
}

Таким образом, форма оператора $i++ не выводит значение $ i, прежде чем оно будетувеличивается.Если вам нужно такое поведение, PowerShell позволяет вам получить такое поведение, поместив оператор приращения (или уменьшения) непосредственно в выражение, например:

function foo {
  $i = 0
  ($i++)
  $i
}

Это выведет @ (0,1).

Брюс Пайетт обсуждает это в главе 5 Windows PowerShell в действии, 2-е издание .Операторы увеличения и уменьшения являются «допустимыми утверждениями».Цитата из книги:

По сути, это означает, что определенные типы выражений, когда они используются в качестве операторов, не отображаются.Допустимые операторы включают операторы присваивания и операторы увеличения / уменьшения.Когда приращение и уменьшение используются в выражении, они возвращают значение, но когда они используются как автономный оператор, они не возвращают значение.

1 голос
/ 24 января 2012

Это потому, что $l++ ничего не возвращает,:

$l = 0
$l++   #nothing
$l #gives 1
$l++   #nothing
($l++)  #gives 2

Это сделано для того, чтобы не было путаницы при возвращении в конвейер. Эффективно,

$l++ равно $l = $l+ 1, поэтому ничего не возвращается.

То, что вы хотите увидеть, это $l = $l + 1; $l, поэтому вы должны сделать ($l++).

0 голосов
/ 24 января 2012

Я думаю, что есть две задачи, которые нужно сделать:

  1. Выполнить $l++ (увеличить переменную), что происходит во внутренних скобках
  2. Получить значение $l, которое указывается во внешних скобках.

Вот иллюстрация этого:

$l = 0
"$($l++ ; $l)"

Выходы: 1, где

$l = 0
"$($l++)"

ничего не выводит.

Чтобы получить вывод, мне нужно два выражения внутри подвыражения. В противном случае единственное, что происходит, - это то, что $l увеличивается, но его значение не получается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...