Как * точно * работает RHS оператора PowerShell -f?

В прошлый раз я запутался КстатиPowerShell С готовностью разворачивая коллекции, Кит подытожил свою эвристику следующим образом:

Помещение результатов (массив) в выражение группировки (или подвыражение, например, $ ()) делает его снова пригодным для развертывания. I '

Я принял этот совет близко к сердцу, но все еще не могу объяснить некоторые эзотерики. В частности, оператор формата неКажется, игра по правилам.

$lhs = "{0} {1}"

filter Identity { $_ }
filter Square { ($_, $_) }
filter Wrap { (,$_) }
filter SquareAndWrap { (,($_, $_)) }

$rhs = "a" | Square        
# 1. all succeed
$lhs -f $rhs
$lhs -f ($rhs)
$lhs -f $($rhs)
$lhs -f @($rhs)

$rhs = "a" | Square | Wrap       
# 2. all succeed
$lhs -f $rhs
$lhs -f ($rhs)
$lhs -f $($rhs)
$lhs -f @($rhs)

$rhs = "a" | SquareAndWrap       
# 3. all succeed
$lhs -f $rhs
$lhs -f ($rhs)
$lhs -f $($rhs)
$lhs -f @($rhs)

$rhs = "a", "b" | SquareAndWrap       
# 4. all succeed by coercing the inner array to the string "System.Object[]"
$lhs -f $rhs
$lhs -f ($rhs)
$lhs -f $($rhs)
$lhs -f @($rhs)

"a" | Square | % {
    # 5. all fail
    $lhs -f $_
    $lhs -f ($_)
    $lhs -f @($_)
    $lhs -f $($_)            
}

"a", "b" | Square | % {
    # 6. all fail
    $lhs -f $_
    $lhs -f ($_)
    $lhs -f @($_)
    $lhs -f $($_)            
}

"a" | Square | Wrap | % {
    # 7. all fail
    $lhs -f $_
    $lhs -f ($_)
    $lhs -f @($_)
    $lhs -f $($_)            
}

"a", "b" | Square | Wrap | % {
    # 8. all fail
    $lhs -f $_
    $lhs -f ($_)
    $lhs -f @($_)
    $lhs -f $($_)            
}

"a" | SquareAndWrap | % {
    # 9. only @() and $() succeed
    $lhs -f $_
    $lhs -f ($_)
    $lhs -f @($_)
    $lhs -f $($_)            
}

"a", "b" | SquareAndWrap | % {
    # 10. only $() succeeds
    $lhs -f $_
    $lhs -f ($_)
    $lhs -f @($_)
    $lhs -f $($_)            
}

Применяя те же шаблоны, которые мы видели в предыдущем вопросе,Понятно, почему такие случаи, как # 1 и # 5, ведут себя по-разному: оператор конвейера сигнализирует обработчику сценариев о необходимости развернуть другой уровень, а оператор присваивания - нет. Иными словами, все, что лежит между двумя |s обрабатывается как сгруппированное выражение, как если бы оно было внутри () 's.

# all of these output 2
("a" | Square).count                       # explicitly grouped
("a" | Square | measure).count             # grouped by pipes
("a" | Square | Identity).count            # pipe + ()
("a" | Square | Identity | measure).count  # pipe + pipe

По той же причине, дело № 7 не является улучшением по сравнению с # 5. Любая попытка добавить дополнительныйЗаворачивать будет немедленно разрушен дополнительной трубой. То же самое # 8 против # 6. Немного расстраивает, но ям полностью на борту до этого момента.

Остальные вопросы:

Почему нетСлучай № 3 постигла та же участь, что и № 4?$ шк должен содержать вложенный массив(, ("а", "а")) но его внешний уровень разворачивается ... где-то ...Какие'что происходит с различными операторами группировки в # 9-10? Почему они ведут себя так странно и зачем они вообще нужны?Почему Дон't отказы в случае № 10 изящно ухудшаются, как # 4?

Ответы на вопрос(2)

Ваш ответ на вопрос