Как заставить функцию возвращать массив из одного элемента вместо содержащегося объекта? - PullRequest
1 голос
/ 27 июня 2019

У меня есть функция (на самом деле это несколько экземпляров), но бывают случаи, когда она может возвращать список из нескольких элементов, и бывают случаи, когда она может возвращать один элемент.Я хочу, чтобы функция возвращала массив ([System.Object[]]) каждый раз, чтобы (на принимающей стороне) я всегда мог ожидать, что это будет массив и индекс в нем, даже если я просто вытягиваю 0-й элемент.

Я пытался привести тип возвращаемого значения несколькими способами (см. Код ниже) ... включая (например) return @("asdf"), return [System.Object[]]@("asdf") и аналогичные, но, похоже, единственное, что позволяет получить согласованное поведение, это добавитьвторой нулевой элемент в массиве ... который мне кажется неправильным.(См. Код ниже)

function fn1 {
    return @("asdf")
}

function fn2 {
    return [array]@("asdf")
}

function fn3 {
    return [System.Object[]]@("asdf")
}

function fn4 {
    # This works but with the side effect of sending a null string that is not actually necessary
    return @("asdf",$Null)
}

$v = fn1            # Same for fn2, fn3.
$v.GetType().Name   # Expected: Object[], Actual: String
$v[0]               # Expected: "asdf", Actual: "a"

$v = fn4
$v.GetType().Name   # Expected: Object[], Actual: Object[]
$v[0]               # Expected: "asdf", Actual: "asdf" 

Ответы [ 2 ]

3 голосов
/ 27 июня 2019

Если я понимаю ваш вопрос, вы можете использовать оператор , при возврате значения; e.g.:

function fn1 {
  ,@("asdf")
}

Функция выведет одноэлементный массив.

2 голосов
/ 27 июня 2019

В качестве альтернативы переносу в дополнительный массив используйте Write-Output -NoEnumerate:

function fn1 {
  Write-Output @('asdf') -NoEnumerate
}

или в расширенных функциях с привязкой к командлету до версии 4.0:

function fn1 {
  [CmdletBinding()]
  param()

  $PSCmdlet.WriteObject(@('asdf'), $false)
}
...