【问题标题】:Passing/updating hashtables and arrays by reference in PowerShell在 PowerShell 中通过引用传递/更新哈希表和数组
【发布时间】:2012-11-05 04:22:08
【问题描述】:

当我了解 Perl 和 PowerShell 的不同之处时,我试图确定通过引用传递和更新列表之间的差异。我认为我现在明白了,PowerShell 方面的。

通过引用传递哈希表:

调用函数时:不必在表名前加上[ref]。在函数内部:param 列表中的表名可以简单地以[hashtable] 开头,而不是[ref] — (因为“收到”它已经是一个引用;所以向我解释了)。如果要在函数内更新哈希表,则在未使用[ref] 时不需要.Value。 IOW:以这种方式调用函数:MyFunction $MyHashTable。函数包含:

param([hashtable]$HashNameWithinFunction)

$HashNameWithinFunction.Add('x', 'y')

通过引用传递数组:

在调用函数时以及在函数的param() 列表中:数组的名称必须以[ref] 开头。当通过引用更新数组时,必须使用.Value。该函数以这种方式调用:MyFunction ([ref]$MyArray)。函数包含:

param([ref]$ArrayNameWithinFunction)

$ArrayNameWithinFunction.Value += 'something new'

我的理解正确吗?我已经测试了上述内容,并且我知道两者都有效。但是,这样做有没有可能出现一些细微的错误?

添加来自 Chrstian 的以下回复:

function UpdateArray {
    param([ref]$ArrayNameWithinFunction)
    $ArrayNameWithinFunction.Value += 'xyzzy'
}
$MyArray = @('a', 'b', 'c')
UpdateArray ([ref]$MyArray)

【问题讨论】:

  • 抱歉,但是.. 您使用的具有value 属性的数组是什么?
  • 命名变量,表示对数组的引用(在函数内)。我会用一个简短的例子来更新这个问题。
  • 修正后的值参数更有意义,不需要你的例子!

标签: arrays powershell hashtable pass-by-reference


【解决方案1】:

你的理解是正确的。一点补充:您通过值传递哈希表,因为您将添加到它,并且哈希表支持本地添加。数组的大小是不可变的(+= 实际上是在后台重新创建数组),因此如果您打算添加,则需要重新创建它,因此需要ref

但请记住,最好避免通过引用传递参数。在某些时候,您可能会忘记它是这样做的,并花更多时间调试您的代码。如果需要更改数组,最好在管道中返回新数组。

【讨论】:

  • 谢谢。有趣的。我曾(错误地)认为,作为函数“接收”,哈希 成为 引用(因此不是按值传递)。回复:在管道上返回更新后的数组:你能推荐一个站点 - 或者可能是 PoSH 书籍之一 - 提供一些语法示例吗?再次感谢。
  • @marst12017:对于您的示例 - 数组 - 只需在准备好返回新数组时添加 return $yourArray 语句。对于更复杂的情况,您只需输入$yourAnotherObject,它将返回到管道,同时您的函数继续处理。因此,您可以原始返回多个对象 - 无需数组或哈希表。如果需要,稍后将它们打包到高级对象中。您可以在 Powershell here 中阅读有关输出的信息。
  • 我在 Perl 脚本中使用函数的方法:通过引用写入标量或列表;如果存在某种严重错误(未找到文件等),该函数将返回 false。然后调用语句“知道”它是否应该继续或停止,发送有关错误的邮件等。文章(谢谢)建议我应该以完全不同的方式考虑这个问题。我希望调用语句根据发生的情况“做出反应”。 (数组或哈希表为空,“函数后”可能不是错误。)
  • @marst12017:您可以同时使用这两种方法,这只是我描述的一种更面向对象的方法,因此在使用 Powershell 时更推荐使用。如果您想出错,您可以使用异常来获得纯粹的 .NET 体验。那么它不仅是真或假,而且是异常对象中返回的错误类型。例如FileNotFoundException.
  • 我意识到这是一个已有四年历史的线程,但关于处理错误:这正是抛出异常的目的。 :)
猜你喜欢
  • 1970-01-01
  • 2015-12-23
  • 2014-12-18
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多