マイナビニュースマイナビ

PowerShell 7.1 - ヌル条件演算子

【連載】

PowerShell Core入門 - 基本コマンドの使い方

【第128回】PowerShell 7.1 - ヌル条件演算子

[2020/12/18 08:00]後藤大地 ブックマーク ブックマーク

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の変更点は小さいものだが、細かい部分の改善が行われているという点で漸進的に改良が進められたバージョンだと言える。こうした細かい改善の積み上げが、結局のところユーザーが扱いやすいツールの礎となるのだろう。

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

もっと知りたい!こちらもオススメ

【連載】RPA入門 - ツールで学ぶ活用シーン

【連載】RPA入門 - ツールで学ぶ活用シーン

AIには、ルールベース、機械学習、深層学習(ディープラーニング)の3つのレベルがあり、レベルが上がるに連れてより高度な人工知能を実現しますが、AIのスピンオフという位置付けで、Digital Labor(仮想知的労働者)によるホワイトカラー業務の自動化を実現するRPAが注目されています。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で TECH+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
Slackで始める新しいオフィス様式
Google Workspaceをビジネスで活用する
ニューノーマル時代のオウンドメディア戦略
ミッションステートメント
次世代YouTubeクリエイターの成長戦略
IoTでできることを見つけるための発想トレーニング
教えてカナコさん! これならわかるAI入門
AWSではじめる機械学習 ~サービスを知り、実装を学ぶ~
Kubernetes入門
SAFeでつくる「DXに強い組織」~企業の課題を解決する13のアプローチ~
マイクロサービス時代に活きるフレームワーク Spring WebFlux入門
AWSで作るマイクロサービス
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る