PowerShellのechoにつまづいたので忘備録。
さて、以下のPowerShellのコードにどのような結果を期待するだろうか?
function Hoge([int]$num) { echo "Debug" return ($num + 1) } Hoge 10
PowerShellの経験が無ければ、おそらく以下のように考えるはずである。
- Debugという文字列が標準出力される
- Hogeは引数に1を足した結果を返す関数である
……残念(?)ながら、この認識は誤りである。
この関数の結果として、Hogeは"Debug"と11を持つ長さ2の配列を返す。
PowerShellにおいては、関数は以下の仕様を持つ(厳格ではないので、問題あれば突っ込んでください)
- echoはWrite-Outputコマンドレットのエイリアスである
- 関数内で出力された全ての値を(パイプラインで扱える形で)返す
- return x は Write-Output x; return; の略記系である (PowerShell イン アクションより)
以上の理由により、上記関数の結果は長さ2の配列となるのである。
ぶっちゃけ、普通に1時間近くハマってました。
標準出力に出すだけならば、[Console]::WriteLineメソッドを使う事で問題を解決できます。
また、不要な値を返す関数を関数内で呼び出す場合は、その命令の結果を逐一 $null 向けにリダイレクトする、あるいは戻り値を変数で受ける必要があります。
関数という名前を持っていながら、単一の値を返す記法が簡単に書けないのはどうにかならなかったのかと、関数型言語を学んだ後に改めて思う今日この頃でした。