4

PerlとPowerShellの違いについて学ぶとき、参照によってリストの受け渡しと更新の違いを突き止めようとしています。PowerShellに関しては、今、私はその考えを理解していると思います。

参照によってハッシュテーブルを渡します。

関数が呼び出されたとき:テーブル名の前に。を付ける必要はありません[ref]。関数内:リスト内のテーブル名の前には、—ではなくparam単に、を付けることができます(「受け取ったまま」はすでに参照であるため、説明されました)。関数内でハッシュテーブルを更新する場合は、使用されていない場合は必要ありません。IOW:次のように関数を呼び出します:。関数には次のものが含まれます。[hashtable][ref].Value[ref]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)
4

1 に答える 1

7

あなたの理解は正しいです。ちょっとした追加: ハッシュテーブルに追加するため、ハッシュテーブルを値で渡します。ハッシュテーブルは追加をネイティブにサポートします。配列はそのサイズに関して不変です (+=実際には舞台裏で配列を再作成します)、追加を計画している場合は再作成する必要があるため、ref.

ただし、参照による引数の受け渡しは避けるのが最善であることに注意してください。ある時点で、それがそのように行われたことを忘れて、コードのデバッグにより多くの時間を費やすかもしれません. 配列を変更する必要がある場合は、パイプラインで新しい配列を返すことをお勧めします。

于 2012-11-16T19:21:06.607 に答える