satocchiaブログ
2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
全1件 (1件中 1-1件目)
1
以前書いた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にこの回答を載っけていいか聞いたら、ぜひに書いておいてくれと言われたので載せます。
2026.03.09
コメント(0)