Функция PowerShell возвращает несколько переменных с типом возврата без изменений - PullRequest
0 голосов
/ 13 июня 2019

Я хочу вернуть 2 hashset<string> из функции и не хочу, чтобы ее тип возвращаемого значения изменялся на строку, если hashset<string> содержит только 1 строковый элемент.

Сначала вернем 1 переменную стип не меняется, мы можем использовать запятую перед переменной, чтобы сохранить тип возвращаемого значения:

Function Foo1 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set1.Add("set 1") | Out-Null
    return ,$set1
}

$set1 = Foo1

Затем, чтобы вернуть несколько переменных и сохранить тип возвращаемого значения, я все еще могу использовать запятая перед переменной:

function Foo2 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set2 = New-Object "System.Collections.Generic.HashSet[string]"

    $set1.Add("set 1") | Out-Null
    $set2.Add("set 2") | Out-Null
    return ,$set1, $set2
}

Но первый вызывающий метод может получить неправильный ответ:

$set1, $set2 = Foo2
Write-Host $set1.GetType() # System.Object[]
Write-Host $set2.GetType() # System.Collections.Generic.HashSet`1[System.String]

И этот вызывающий метод может получить правильный ответ:

,$set1, $set2 = Foo2
Write-Host $set1.GetType() # System.Collections.Generic.HashSet`1[System.String]
Write-Host $set2.GetType() # System.Collections.Generic.HashSet`1[System.String]

Мой вопрос 1: В чем разница между этими двумя вызывающими методами и почему они действуют по-разному?

Мой вопрос 2: Можетмы используем явное преобразование, чтобы сохранить тип возвращаемого значения вместо запятой?

[System.Collections.Generic.HashSet[string]]$set1, [System.Collections.Generic.HashSet[string]]$set2 = Foo2

1 Ответ

0 голосов
/ 13 июня 2019

Оператор запятой

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

В Foo2 вы возвращаете массив, где 0-й слот содержит массив со входом on (,$set2), а 1-й слот содержит хэш-набор (, $set1). В описании оператора запятой говорится (= As a unary ...).

В Foo1 вы возвращаете массив с ровно одной записью (= $set1).

Вам следует пересмотреть свое понимание поведения возврата PowerShell. PowerShell ориентирован на конвейер, вот почему:

  function Foo1 {
      ...
      return $set1
  }

возвращает string. Причина: PowerShell будет возвращать каждую запись $set1 для достижения этой цели:

 Foo1 | Where-Object { $_ -like "*set 1*" }

На основании этого вы сможете фильтровать каждую запись, содержащуюся в хэш-наборе.

Я думаю, что вы хотите следующее:

function Foo2 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set2 = New-Object "System.Collections.Generic.HashSet[string]"

    $set1.Add("set 1") | Out-Null
    $set2.Add("set 2") | Out-Null
    $rv = @()
    $rv += $set1
    $rv += $set2
    # every entry of $rv1 is returned "seperatly"
    $rv
}

# $result[0]  will return hashset1
$result = Foo2

Другой альтернативой может быть возврат двух массивов с ровно одной записью из Foo2:

function Foo2 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set2 = New-Object "System.Collections.Generic.HashSet[string]"

    $set1.Add("set 1") | Out-Null
    $set2.Add("set 2") | Out-Null

    , $set1
    , $set2

}

Вам также следует прочитать документ о ключевом слове PowerShells return , он ведет себя иначе, чем в других языках сценариев.

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

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