簡単なパーサーを作成して、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()
ますか?