2012年11月20日火曜日

備忘:VBSのnullとemptyの違い

エラトステネスの篩でかるい配列の為にemptyとか使ってましたがそもそも空って何?という話。 

まぁ空っぽいのって言う感じでしょうか。判定と状態についてです。

 "" これはいわゆる空文字(日本語的におかしくなるけど)0文字数の文字列です
null これは無効な値です。(特殊な判定されがちで個人的にあんまり使いたくない)
empty これは初期化されていない変数の値です


■簡単なチェックをしましょう
""nullempty
+1えらーnull1
*1えらーnull0
&"str""str""str""str"
typename()StringNullEmpty
isnull()falsetruefalse
isempty()falsefalsetrue
if 時のbool値えらーfalsefalse

多少微妙ですがこんな表になります。

・空文字は言わずもがなただ文字数が0なだけで全て文字判定です説明要らないですよね?


・emptyについて
数値処理が来た場合0として扱われます。ゆえに+1では1を返し、*1では0となります。
文字列処理が来た場合は空文字として扱われます。
if 時のboolにおいてemptyの判定はfalseです。

if 時のboolってなんぞや?って思う人が居るかもしれませんが判定略書き字に役に立ちます。
if empty then msgbox"true" else "false"
こんな感じです。

まぁ内部でif中の判定がどんなに難しくても結果あの中で処理されるのは「0またはそれ以外の値」、「Trueまたはfalse」って事です。

それでemptyっていつ役に立つの?って話ですが初期化判定で使える事です(あまぁ当たり前だけど)。
「a=inputbox()」と処理を書いた場合にOKの場合文字数に関わらず文字列キャンセルを押した場合代入自体が行われないのです。
「if isempty(inputbox("")) then msgbox"empty" else msgbox"string"」
を試してみれば理解できるかと思います。


・nullについて
正直判定や処理が微妙です。
計算を代入などしても値はnullであり表示などではエラーします。
たとえば「a=null+1」の時点ではエラーなどはありませんがそのあとに「msgbox a」とするとエラーします。また、Cscript時に「a=null+1」後に「wsh.echo a」とした場合エラーせずに、コンソールにはnullが表示されます。
文字列処理において「msgbox null」はエラーとなり「msgbox null & ""」だと通ります。

そしてif時の判定ですが「if null then msgbox"true" else "false"」nullの判定はfalseです。


とまぁ、こんな感じです。nullは使い辛いですが逆にエラー処理とか作るときには楽しそうです。



0 件のコメント:

コメントを投稿