3

簡単なパーサーを作成して、PowerShellを自分で学んでいます。.NetFrameworkクラスを使用していCollections.Stackます。スタックの一番上にあるオブジェクトを所定の位置に変更したいと思います。

pop()オブジェクトをオフにして変更してからオンに戻すことができることはわかっていますpush()が、それは私をエレガントではないと思います。

まず、私はこれを試しました:

$stk = new-object Collections.Stack
$stk.push( (,'My first value') )
( $stk.peek() ) += ,'| My second value'

エラーをスローしました:

Assignment failed because [System.Collections.Stack] doesn't contain a settable property 'peek()'.
At C:\Development\StackOverflow\PowerShell-Stacks\test.ps1:3 char:12
+ ( $stk.peek <<<< () ) += ,'| My second value'
    + CategoryInfo          : InvalidOperation: (peek:String) [], RuntimeException
    + FullyQualifiedErrorId : ParameterizedPropertyAssignmentFailed

次に私はこれを試しました:

$ary = $stk.peek()
$ary += ,'| My second value'
write-host "Array is: $ary"
write-host "Stack top is: $($stk.peek())"

これはエラーを防ぎましたが、それでも正しいことをしませんでした:

Array is: My first value | My second value
Stack top is: My first value

明らかに、$ aryに割り当てられるのはスタックの最上位にあるオブジェクトのコピーであるため、$ aryにあるオブジェクトを作成しても、スタックの最上位にあるオブジェクトは変更されません。

最後に、[ref]タイプを読み、これを試しました。

$ary_ref = [ref]$stk.peek()
$ary_ref.value += ,'| My second value'
write-host "Referenced array is: $($ary_ref.value)"
write-host "Stack top is still: $($stk.peek())"

しかし、まだサイコロはありません:

Referenced array is: My first value | My second value
Stack top is still: My first value

このpeek()メソッドは、クローンではなく、実際のオブジェクトへの参照を返すと思います。その場合、参照はPowerShellの式処理ロジックによってクローンに置き換えられているように見えます。

私がやりたいことをする方法があるかどうか誰かに教えてもらえますか?pop()または、 /変更/に戻す必要がありpush()ますか?

4

2 に答える 2

2

配列のサイズは常に固定されています。配列にアイテムを追加すると、長さが長くなった新しい配列が作成され、古い配列が新しい配列にコピーされます。参照が暗黙的に変更されたため、2つの要素を持つまったく新しい配列が作成されましたが、スタックには古い配列が含まれています。代わりにリストを使用してください。

于 2010-05-22T16:16:37.887 に答える
1

私はそれを考え出した。コピーを作成したのは「+=」演算子でした。.Net配列に要素を追加できないようです。ハッシュテーブルなどの別のタイプのオブジェクトを使用する場合、要素を適切に追加するのに問題はありません。

$stk.push( @{"1"="My first value"} )
$stk.peek()["2"]="| My second value"
write-host "Stack top keys: $($stk.peek().keys)"
write-host "Stack top values: $($stk.peek().values)"

どちらが得ます

Stack top keys: 1 2
Stack top values: My first value | My second value

または、より配列に似たオブジェクトの場合、Collections.ArrayListは機能します

$item = new-object Collections.ArrayList
$stk.push( $item )
$stk.peek().Add( "My first value" )
$stk.peek().Add( "| My second value" )
$obj = $stk.peek()
$obj.Add( "| My third value" )
write-host "Stack top is: $($stk.peek())"

どの出力

Stack top is: My first value | My second value | My third value
于 2010-05-22T16:15:40.917 に答える