openlang

Что делает унарная запятая

Читая Powershell in Action, застрял на одном месте в Chapter 5. Результат понимаю, но не мог бы кто-нибудь объяснить назначение и причину такого поведения?

$nested = 4, (5, 6)
$flattened = $nested | foreach { $_ }

$flattened.length

Здесь $flattened.length получается равным 3. Вполне понятно.

$nested = 4, (5, 6)
$flattened = $nested | foreach { ,$_ }

$flattened.length

Теперь $flattened.length даёт 2.

Запуск $flattened[0]; $flattened[1] -join "," показывает, что это за 2 объекта, но что именно делает запятая внутри второго ForEach?

То есть смысл примерно такой: “Оставь 4 одним объектом, а (5,6) отдельным объектом. Не разделяй их.”

Переведено с английскогоПоказать оригинал

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Конвейер Powershell “разворачивает” коллекции ради удобства пользователей и, забавно сказать, ради “единообразия”. Унарный оператор запрещает powershell это разворачивание. Те примеры не самые удачные, попробую зайти с другой стороны.

    Посмотрите на вывод двух фрагментов

    (4, 5, 6) | ForEach-Object {
        Write-Host "Pipeline element now: $_"
    }
    
    Pipeline element now: 4
    Pipeline element now: 5
    Pipeline element now: 6
    ,(4, 5, 6) | ForEach-Object {
        Write-Host "Pipeline element now: $_"
    }
    
    Pipeline element now: 4 5 6

    Во втором вся коллекция передаётся целиком как один объект, поэтому разворачивания не происходит. Это массив, а пробелы вместо запятых появляются из-за стандартного разделителя полей вывода, которым служит пробел (он хранится в $ofs). Это можно увидеть так

    "$(4, 5, 6)"
    
    4 5 6

    Когда массив встраивается в строку, powershell соединяет его элементы стандартным OFS. Изменить его можно, хотя нужно это редко.

    $ofs = '/~/'
    
    "$(4, 5, 6)"
    
    4/~/5/~/6

    Один из довольно частых для меня случаев применения унарного оператора: разбить значения, но при этом передать все элементы вместе одним объектом.

    ,(-split 'Tavin enjoys powershell') | ForEach-Object {
        [PSCustomObject]@{
            Who   = $_[0]
            Does  = $_[1]
            Topic = $_[2]
        }
    }
    
    Who   Does   Topic
    ---   ----   -----
    Tavin enjoys powershell
    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Как случайно выбирать варианты enum в GDScript на Godot 3.3, не перечисляя их?

    Вот объявление enum, которое я использую в GDScript: Хочу случайно выбирать вариант enum, не перечисляя все возможные вариант…

    Ответы 2Последняя активность gdscript
  2. Синтаксис остатка в Nim

    Как в Nim записать операцию взятия остатка? cell % 7 == 0 выдаёт undeclared identifier: '%' Ни поиск в Google, ни просмотр SO…

    Ответы 2Последняя активность nim
  3. Возврат результата из функции APL

    Как сделать так, чтобы моя функция возвращала значение после завершения выполнения? Например, у меня есть: ROUTINE N ? N ⍴ 12…

    Ответы 2Последняя активность apl