PowerShell 7.0の段階で実験的機能としてヌル条件演算子が導入された。配列に対する表記方法は変更となったようだが、PowerShell 7.1ではこの機能が実験的機能から正式な機能へと格上げされた。これにより、従来のコーディングに影響を与えることなく、かつ、より短く簡潔な書き方が可能になる。導入を阻害する要因は少なかったと言える。
オブジェクトがヌルだった場合、オブジェクトに対してメソッドをコールしようとするとエラーが発生する。ヌル条件演算子はこれを抑制するもので、オブジェクトがヌルだった場合には処理が行われなくなる。ヌル条件演算子が存在しない場合、処理を行う前にオブジェクトがヌルかどうかをif文で判定し、処理を切り分けるといったような処理をする必要があるが、ヌル条件演算子を使うとその手間がいらなくなる。
対象がヌルだった場合には別の処理を行う必要があるようなケースでは使えないが、ヌルだった場合にはただ処理を飛ばすだけでよいということなら、ヌル条件演算子の出番だ。
変数に対してヌル条件演算子「${}?.」
変数がヌルだった場合には処理せず、ヌルじゃない場合には処理する、といった場合には「${変数名}?.」という表記を使う。変数名を波括弧で囲い、さらに締めの波括弧の後に「?」を付ける。次の動作例を見てみよう。
変数$vに文字列オブジェクトが代入されている状態では、文字列オブジェクトのメソッドをコールできている。「$v.CompareTo(“password”)」が問題なく動作している。「$v」に「$null」を代入して同じことをしようとすると「InvalidOperation: You cannot call a method on a null-valued expression.」というエラーが発生する。
この部分の表記を「${v}?.CompareTo(“password”)」のようにヌル条件演算子に変えると、「$v」の中身が「$null」でもエラーは発生しなくなる。「$v」がヌルだった時点で次の処理は行われないからだ。これがヌル条件演算子の動作例である。変数に対してヌル条件演算子を使う場合、変数は「${変数名}」のように波括弧で囲ったスタイルにする必要がある点には注意が必要だ。
メソッドの返り値に対してヌル条件演算子 ()?.
ヌル条件演算子はメソッドの返り値に対しても直接指定することができる。例えば、次の動作例を見てみよう。
「$v.Get(0)」は、上のほうでは数字の「1」が返ってきている。これに対してさらに「.toString()」をつなげれば、文字列の「1」を得ることができる。
下のほうの「$v.Get(0)」では返り値として「$null」が戻ってきている。つまり、「.toString()」は「$null」に対してコールしていることになる。「$null」にはメソッドをコールすることはできないので、ここは当然ながら「InvalidOperation: You cannot call a method on a null-valued expression.」のエラーが発生する。
この部分を「$v.Get(0)?.toString()」にすると、この処理ではエラーが発生しなくなる。「$v.Get(0)」が「$null」を返してきたら、その後の処理は行われなくなるからだ。
配列に対してヌル条件演算子「[]?.」
ヌル条件演算子は配列に対しても使用できる。次の動作例を見てみよう。
上記では「$v」は配列として生成されており、要素として数字を3個持っている。当然、アクセスは「$v[0]」「$v[1]」「$v[2]」となる。範囲を超えて「$v[3]」とアクセスすると「$null」という扱いになる。このため、「$v[3].GetType()」のようにメソッドをコールしようとすると、当然だが「InvalidOperation: You cannot call a method on a null-valued expression.」でエラーになる。
今度はこの部分の表記を「$v[3]?.GetType()」のように変更する。こうすると「$v[3]」がヌルだった場合には次の処理は行われないのでエラーは発生しなくなる。
ヌル条件演算子でコードの流れを見通し良く
PowerShell 7.1で導入されたヌル条件演算子の表記は「.」の前に「?」を書くという表記で統一されている。つまり、「?.」という書き方になるわけだ。例えば、中身を表示したいだけで、ヌルだった場合に別の処理を行う必要がないのであれば、「.」部分をひたすら「?.」に置き換えるだけでエラーが発生しないコードになる。デバッグ時のコードには便利だろう。
ヌル条件演算子のようなヌル系の機能は、比較的モダンなプログラミング言語に導入されている。古いプログラミング言語には、同様の目的の演算子はないことが多い。if文で比較するなどして処理を書くというのが一般的だ。
しかし、最近のプログラミング言語にはこの手の演算子が用意されている。結局のところ、便利なのだ。プログラミング言語の読みやすさは多分に主観的なものになりやすいのだが、ヌル条件演算子のような機能があると比較的読みやすいコードになるような気がする。処理の流れやロジックを阻害しないでコードを書けるようになるといった印象だ。
PowerShell 7.1の変更点は小さいものだが、細かい部分の改善が行われているという点で漸進的に改良が進められたバージョンだと言える。こうした細かい改善の積み上げが、結局のところユーザーが扱いやすいツールの礎となるのだろう。