我一直在將 $psBoundParameters 添加到這樣的哈希表中。
$seedTaskState = @{
arguments = $PSBoundParameters
}
稍后,我需要使用這些相同的引數來呼叫下一個函式,其中一個值已更改。所以我用了這個
$nestedTaskParameters = $seedTaskState.arguments
然后更改了我需要更改的一個值。哪個...不起作用,因為復雜型別是參考,所以我正在更改原始系結引數,這會導致各種問題。
我可以初始化$nestedTaskParameters為一個哈希表并回圈遍歷系結引數并添加它們,就像這樣。
$nestedTaskParameters = @{}
foreach ($key in $seedTaskState.arguments.Keys) {
$nestedTaskParameters.Add($key, $seedTaskState.arguments.$key)
}
我曾認為這可能會奏效,而且會更優雅
$nestedTaskParameters = $seedTaskState.arguments.Clone()
但.Clone()僅適用于哈希表,而不適用于系結引數字典。
所以我嘗試先轉換$seedTaskState.arguments到哈希表,然后像這樣進行克隆。
$nestedTaskParameters = ([Hashtable]$seedTaskState.arguments).Clone()
這似乎有效,但也超出了我的舒適區,所以我想知道這種方法是否存在某種問題?
uj5u.com熱心網友回復:
如果您的意圖只是使用
argumentsfor 引數splatting,可以通過強制轉換(在幕后呼叫適當的建構式)將自動
$PSBoundParameters變數的條目(其型別源自通用字典(System.Collections.Generic.Dictionary`2) )復制到哈希表( ) 中。[hashtable]- 鑒于強制轉換總是會創建一個新的哈希表物件,它已經是一個克隆,因此無需呼叫
.Clone()它。
- 鑒于強制轉換總是會創建一個新的哈希表物件,它已經是一個克隆,因此無需呼叫
Splatting 適用于任何實作System.Collections.Generic.IDictionary`2.NET 介面或其非通用對應物的類似字典的型別,System.Collections.IDictionary.
警告:
生成的哈希表是一個獨立于的條目集合
$PSBoundParameters,即您可以獨立地添加或洗掉條目或為其條目分配新值,而不會影響$PSBoundParameters。但是,如果
$PSBoundParameters條目值碰巧是.NET參考型別的實體,則從任一字典修改這些值會影響兩個字典,因為兩個字典中的相應條目“指向”(參考)完全相同的物件實體。也就是說,[hashtable]建構式創建的是 中條目的淺拷貝$PSBoundParameters,這同樣適用于呼叫.Clone()現有的哈希表。如果您需要避免這種情況,則必須手動創建此類值的深層副本,這可能很重要;要確定給定值是否是 .NET 參考型別的實體,請使用
-not $someValue.GetType().IsValueType有關更多資訊,請參閱此答案。
# Sample function.
function Foo {
param(
$bar,
$baz
)
# Effectively copy the entries from $PSBoundParameters into a
# new hashtable.
$hashtable = [hashtable] $PSBoundParameters
# Add new entries to the hashtable.
$hashtable.new1 = 'stuff1'
$hashtable.new2 = 'stuff2'
# Remove one.
$hashtable.Remove('bar')
# Modify the instance of the .NET reference type stored in the entry
# with key 'baz'.
# THIS AFFECTS THE ORIGINAL ENTRY IN $PSBoundParameters TOO.
$hashtable.baz.prop = 2
# Output the two dictionaries.
'-- $PSBoundParameters'
$PSBoundParameters
"`n-- hashtable`n"
$hashtable
}
# Call the function with an instance of a value type and a reference type.
Foo 42 ([pscustomobject] @{ prop = 1 })
以上產生了以下結果,這表明直接修改其值為 .NET 參考型別實體的條目會影響兩個字典,而添加和洗掉條目則不會:
-- $PSBoundParameters
Key Value
--- -----
bar 42
baz @{prop=2}
-- hashtable
new2 stuff2
new1 stuff1
baz @{prop=2}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/331888.html
下一篇:如何呼叫嵌套哈希表中的鍵?
