2011/05/05
stringを引数に取るメソッドに$nullを渡すと勝手にstring.Emptyに変換されてしまう
仕様みたいです。以下、検証コード。
$def = @" public static string TestMethod(string str) { if(str==null) { return "null"; } else if(str==string.Empty) { return "empty"; } else { return "other"; } } "@ $test = Add-Type -memberDefinition $def -name "TestClass" -passThru $test::TestMethod($null)
結果は「null」ではなく「empty」になってしまいます。
Windows Phone 7 エミュレーターをビルド後アクティブにする « LiveSpac.esのコメント欄でも書いたのですが、回避策はリフレクション経由でメソッドを呼ぶしかなさそうです。
$test.GetMethod("TestMethod").Invoke($null, @($null))
このように、Invokeメソッドの第一引数はスタティックメソッドの実行なのでインスタンスを指定しないので$null、第二引数はメソッドに与える引数の配列を指定します。ここでは引数は一つ、その値は$nullなので、@($null)を指定します。このようにすると結果は「null」となり意図した結果が得られます。
元記事:http://blogs.wankuma.com/mutaguchi/archive/2011/05/05/198785.aspx2007/08/05
PowerShellの再帰呼び出しは100まで
今日まっちゃ139勉強会でインスパイアされてPowerShellでは再帰呼び出しが何回できるのか?ということを調べたら100回でした。どっかに説明があった気もする…。以下、2分で書いた検証コード。(2分もかけるなって?w)
$b=1;function a(){$b++;$b;a};a
実行結果
2 3 4 5 6 7 8 9 略 94 95 96 97 98 99 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。呼び出しの深さ が 101 に達しましたが、最大値は 100 です。
ちなみにVBScriptやJScriptは環境依存しますがメモリ容量が足りないというエラーで最後は終了しますがだいたい1000〜2000階層くらいまでいけるっぽいです。あれ、再帰呼び出ししてるときにスタック領域が不足しましたってエラーを見ることがあるんだけどどうやったら出るんだっけ?
b=1 a Sub a() b=1+b wscript.stdout.writeline b call a() End Sub
var b=1; a(); function a(){ b++; WScript.StdOut.WriteLine(b); c=a(); }
おまけ。やはりインスパイアされてfizz buzz問題をPowerShellで書いてみた。これ5分くらいかかったので私はだめかもしれません。変数1個でいいですね、よく考えると。てんぱってるとだめみたいです。
1..100|%{$a="";$b=$false;if($_ % 3 -eq 0){$a+="fizz";$b=$true};if($_ % 5 -eq 0){$a+="buzz";$b=$true};if(!$b){$_}else{$a}}元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/08/05/88870.aspx
Copyright © 2005-2018 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp
プライバシーポリシー