Как добавить "строку" к переменной "строка []"? - PullRequest
0 голосов
/ 22 мая 2019

Предположим, у меня есть функция PowerShell, которая возвращает [string[]]:

function do_something() {
    [string[]]$str_array = @("one", "two", "three")
    return $str_array
}

$x = do_something()

# doesn't work
$y = @("something", $x)

Теперь я хочу добавить строку в начало списка [string[]].

Какя бы сделал это?

1 Ответ

0 голосов
/ 23 мая 2019

Существует несколько способов для объединения двух массивов.Что касается вашего вопроса в приведенном выше комментарии:

Интересно, я не знал, что "," отличается от ";"при формировании списка ...

В PowerShell , является собственным оператором, где его поведение отличается, если используется в унарном или двоичном операторе.

От about_operators :

В качестве двоичного оператора запятая создает массив.Как унарный оператор, запятая создает массив с одним членом.Поставьте запятую перед членом.

В коде @("something", $x) вы используете оператор в двоичном виде.Таким образом, создается новый массив с двумя записями.Первая запись - это строка «что-то», вторая запись содержит массив строк.Это потому, что PowerShell интерпретирует это как: «Хорошо, я создам новый массив с двумя записями (=« что-то »и ссылкой, указывающей на массив).

Мы можем проверить это с помощью или Get-Member:

C:\> $y | Get-Member          


TypeName: System.String
    Name             MemberType            Definition
    ----             ----------            ----------
    Clone            Method                System.Object Clone(), System.Object ICloneable.Clone()
    ...


    TypeName: System.Object[]
    Name           MemberType            Definition
    ----           ----------            ----------
    Add            Method                int IList.Add(System.Object value)
    ...

Как видно, Get-Member показывает использование двух TypeName s. Первый - строка, второй - массив.

При изменении кода на@("something"; $x) no , -оператор больше не используется. Вместо этого код теперь разделен примерно на три «команды», поскольку используется разделитель команд (= ;).

  • Cmd1: «что-то»
  • Cmd2: $ x ->, который выводит содержимое массива
  • Cmd3: @ () -> гарантирует, что выражения в скобках будут возвращены как массив.

Вы также можете удалить разделитель команд и определить $y в нескольких строках:

PS C:\>$y = @("something"
>>>      $x
>>>     )

Если вы будете менее неоднозначными, я бы порекомендовал объединить два массива следующим образом:

    PS C:\> $a = 1
    PS C:\> $b = @(2,3,4)
    PS C:\> $c = @()
    PS C:\> $c += $a
    PS C:\> $c += $b
    PS C:\> $c
    1
    2
    3
    4
    PS C:\> $c | gm


    TypeName: System.Int32
    Name        MemberType Definition
    ...

Конечно, это «более» код, но он менее неоднозначен.

Надеюсь, это поможет.

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