« [P15]WPF:ItemsSource が使用中で、ListBox.Items.Add メソッドが無効の場合 | トップページ | [P17] WPF: テキスト(日本語)の縦書き(宛名書きのみ) »

[P16] PowerShell:関数の引数および関数の戻り値が正しく受け取れず、おかしくなってしまう場合の対処法

PowerShell 関数における引数と戻り値については、その渡し方と受け取り方が C# などの通常の言語感覚とは多少異なります。
私のように、単なるクライアント環境下で、コマンドラインからではなく通常の言語感覚で Script ファイルから、それなりの規模の自分のライブラリを作成・利用しながら PowerShell を使おうとすると、おそらく一度は、関数の引数およひ戻り値が正しく受け取れない、おかしくなってしまうという問題に直面することがあるのではないかと思います。

私は、この問題でだいぶ苦労致しましたので、以下に『常に関数はこうして扱っておけば、絶対に大丈夫だ』という自分なりに見いだした結論を同じ問題に直面している方の御参考のために紹介しておきます。
理由・根拠等を書いていると長くなりますので、結論のみを記します。あとは、いかなる場面でも常にこの『鉄則)』に沿ってコーディングするだけです。

なお、引数問題と戻り値問題は、一応別個の事柄ですが、関数の使用という実際上の観点から、ここでひとまとめにして書いておきます。

   ----------------------------------------------------

【関数の引数渡し】

関数の引数渡しに問題が生ずるのは、渡す側と受け取る側で異なった形式を使ってしまうことに起因します。これには、ある形式では引数渡しに限界があり、不自由だという事情も絡んでいます。
関数の引数渡しに関しての鉄則は、引数渡しをすべて配列で行う(以下、配列型という)と決めて、それに徹するということです。それ以外は使わないことです。とにかく、いろいろ試してみた最終結論です。

① 関数側(引数を受け取る側)

  function MyFunc()
  {
     PARAM($para)
     $MyStringParameter = [String] $para[0]
     $MyIntParameter    = [int]$para[1]
        ・・・
     #------------
      ・・・関数本体の内容 
  }
 
引数並びは、配列 $para として渡されてくるものとして、すべて対処しておきます。

C# などなら、

  MyFunc(string $MyStringParameter, int $MyIntParameter)

とするところを、必ず以上のように記します。
   配列の要素を型変換(キャスト)して、受け取ります。

引数が、1個の場合でもこの配列型に徹します。すなわち、   

  PARAM($para)
  $MyStringParameter = [String] $para[0]

とします。

引数がない関数の場合は、引数の受け取りの記載は一切不要です。

配列型で処理しますから、上記引数の受け取りは、以下のようにも記述できます。

  function MyFunc()
  {
     PARAM ( $para)
     $i=0
     foreach($e in $para) {
       switch($i) {
         0 {$MyStringParameter  = [String]$e; break}
         1 {$MyIntParameter = [int]$e; break}
       }
       $i++
    }
      #------------
        ・・・関数本体の内容
  }

私は、引数並びによっては、この後者を使う場合もありますが、$para が配列として渡されているということをはずしさえしなければよいので、実質的に同じです。

② 関数の使用[引数を渡す側]

    こちらは、必ず配列として $para が渡されるように以下の型に徹します。 

   $retValue = MyFunc @($MyStringParameter, $MyIntParameter, ・・・)

  引数が、一つの場合もこの鉄則を維持します。

   &retValue = MyFunc @($MyStringParameter)

  但し、全く引数がない場合は、

   &retValue = MyFunc

  のみです。

【関数の戻り値】

戻り値の問題は、それ以前に使用した関数の戻り値がクリアされずにそのまま戻ってきてしまうことから起こります。
そこで、あらゆる関数使用に際して必ず戻り値を受け取るように使用します。
『戻り値を受け取る必要がなくても』、また『戻り値を返さない関数であっても』戻り値を受け取っておく、ということに徹します。
『戻り値を返さない関数であっても』戻り値を受け取って、エラーにはなりません。

  $dummy = MyFunc @(MyPara_1, MyPara_2, ・・・・)
  $dummy = MyFunc

以上、あらゆる場合を上記原則通りに押し通して例外を作らなければ、引数・戻り値問題で悩まされる必要は一切解消致します。これで安心して、ライブラリを構築し、安定した使用ができます。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
目次に戻る ・・・・ 左欄のカテゴリー 【パソコンの窓】 をクリック
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

|

« [P15]WPF:ItemsSource が使用中で、ListBox.Items.Add メソッドが無効の場合 | トップページ | [P17] WPF: テキスト(日本語)の縦書き(宛名書きのみ) »

コメント

コメントを書く



(ウェブ上には掲載しません)




« [P15]WPF:ItemsSource が使用中で、ListBox.Items.Add メソッドが無効の場合 | トップページ | [P17] WPF: テキスト(日本語)の縦書き(宛名書きのみ) »