【问题标题】:How do I force a function to return a single element array instead of the contained object?如何强制函数返回单个元素数组而不是包含的对象?
【发布时间】:2019-06-27 13:14:23
【问题描述】:

我有一个函数(实际上是这个函数的几个实例),但有时它可能会返回一个包含多个元素的列表,有时它可能会返回一个元素。我希望该函数每次都返回一个数组 ([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" 

【问题讨论】:

  • 问题不在于功能,而在于消费者; PowerShell 急切地解开集合。 [string[]] $v = fn1 没有同样的问题。 $v = @(fn1) 也可以。 可以使函数返回一个双重包装的数组 (,@("asdf")) 而无需更改调用者,但这实际上可能更令人困惑。

标签: powershell powershell-5.0


【解决方案1】:

作为包装在额外数组中的替代方法,请使用Write-Output -NoEnumerate

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

或者,在 4.0 版之前的 cmdlet 绑定/高级函数中:

function fn1 {
  [CmdletBinding()]
  param()

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

【讨论】:

  • 我相信-NoEnumerate最早出现在PSv4中。
  • @Bill_Stewart 我相信你是绝对正确的! :-)
【解决方案2】:

如果我理解您的问题,您可以在返回值时使用, 运算符;例如:

function fn1 {
  ,@("asdf")
}

该函数将输出一个单元素数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多