PR
キーワードサーチ
カレンダー
コメント新着
フリーページ
購入履歴
以前書いた powershellのヌルは負数? 。誰も答えてくれず謎だったけど、大Google先生のAIモードに聞いてみたらあっけなく解決した、らしい。
「らしい」というのはその回答の一部、特に最後のあたりを完全には理解出来ていないからです。人工知能に追いつかない知能の持ち主です、はい。以下、謎への回答。謎番号の内容は上のリンクを見てね。
<謎 1> $null の型はどうやって調べる?
「何もないもの」に「お前の型は何だ?」とは聞けない、という哲学的な壁です。
$null に対してメソッド(.GetType())を呼ぼうとすると、システムは「実体がないのに命令を出すな!」と怒ります。型を知るには、比較演算子を使ってシステム側に判定させるのが正解です。
調べ方: $null -is [object]
答え: True が返ります。
真相: 厳密には、.NET の System.DBNull や null 参照 ですが、pwsh においては「何の型でもないが、すべてのオブジェクトの底にいる存在」として扱われます。
※ ちなみに、パイプラインで何も流れてこなかった時の「空」は [System.Management.Automation.Internal.AutomationNull]::Value という別の化け物(通称:超null)だったりします。
<謎 2> 0より小さいのに符号はゼロ?
これは pwsh の「比較時の型変換ルール」が生んだ錯覚です。
$null -lt 0 が True になる理由:
pwsh の比較では、「左側の型に合わせて右側を変換する」、あるいは「数値と比較する際は
null はどんな数値よりも小さい」 という順序定義が優先されます。
[math]::sign($null) が 0 になる理由:
このメソッドに $null を渡すと、.NET の型変換によって $null が 数値の 0 に変換されてから計算されます。そのため、結果は 0 になります。
結論: $null はマイナスの数ではなく、「比較の序列では最底辺」だが、「計算に使うと 0 に化ける」という、二面性を持った存在なのです。
<謎 3> 配列の $null 比較で頭が爆発する理由
ここが一番の「アハ体験」ポイントです。pwsh の -eq には、恐ろしいルールがあります。
「左側に配列を置くと、比較ではなく『フィルタリング』として動作する」
これを踏まえて、あなたの実験を解釈しましょう。
@(1, $null, 3) -eq $null
挙動: 配列の中から $null を探して、見つかった $null だけの配列 ($null) を返します。
ifの判定: 要素が 1つ の配列の場合、その 中身の真偽 を見ます。中身が $null(偽)なので、結果は False になります。
@(1, $null, 2, $null, 4) -eq $null
挙動: $null が2つ見つかり、要素が2つの配列 ($null, $null) を返します。
ifの判定: pwsh の if は、「要素が 2 つ以上ある配列」は中身が何であれ True と判定します!
結論: だから $null が2つ以上入っていると「NULL」と表示されてしまったのです。
$a と $b の違い
$a = @($null, $null) → 要素数は 2。-eq の結果も要素数 2 なので True。
$b = @($null,,, $null) → このカンマの書き方だと、内部で「空の配列」などが入れ子になり、フィルタリングの結果が複雑に(あるいは要素数1に)変化した可能性があります。
AIにこの回答を載っけていいか聞いたら、ぜひに書いておいてくれと言われたので載せます。
