CATEGORY:VB.NET
今日も一日慣れないVBのコードを弄るお仕事をしたワタシです。んで、悩んだ。超悩んだ。何をってね、論理演算子ですよ。二項論理演算子。AndとかOrとかね。それがどうもうまく動いてくれない。思い通りに動作してくれない。困ったワタシがたどり着いた新事実。VBのAndとかOrとかはショートサーキットしないんですって。オオゥ!なんだかとっても新感覚!今までワタシが触れてきた言語では、論理演算子ってのはショートサーキットするものだったのですよ。Orを例にすると、先に評価した方が真であればもう一方は評価する必要はないからスルーしますと。
'つまり、下記のような条件で
If func(a) = True Or func(b) = True Then
'func(a)がTrueであればその時点で条件が真となるので
'func(b)の呼び出し自体が行われないハズだと
思いこんでたのですよ。勝手に。ところがどっこい。VBでOrって書いたら常にどちらも評価しますだって。ショートサーキットさせる場合はAndAlsoとかOrElseとか、そのための演算子があるんだって。いやぁ、思いこみって怖いね。世の中知らないことばかりですよ。
仕事でVBのコードを見てるのだけど、慣れない。何もかもダメだ。関数が戻り値を返すのを、関数名に値を入れることで実現できます。なんてのも慣れない。なんかスタックオーバーフローしそうなイメージが無い?いや、昔ね、新人さんがC#で
public int Foobar {
set {
// this.foobar = value; // こうじゃなくて
this.Foobar = value; // こう
}
}
みたいなコードを書いて見事に再帰してスタックを食いつぶしてた事があったので。まあ関数の戻り値とは違うけど、なんかそんなイメージがね。あるのよ。
あと、配列。
Dim foobar As Integer() = New Integer(10)
こんな感じで配列を定義した時、配列のサイズは11になります。なんて言われてもね、馴染めないんですよ。一瞬固まってしまうんですよ。VB難しいなぁ。
例えばね。文字列の配列があって、それを特定の文字で埋めたい。そんな欲求。pythonだと、
s = [0] * 10
#ってのがあったとき、
s = ['X'] * 10
#でいい、のか?
s = ['X' for x in s]
#でも大丈夫?
s = map(lambda: 'X', s)
#みたいな感じでも、まあ出来るっちゃあ出来るのか。
とまあね、多分こういう方法があるんですよ。正直pythonてまだよく分かってないんだけど。
で、だ。VBですよ。VB.NETで同じ事をする場合は、どうしたらいいの?勿論、ループを使わずという事なんだけど。.NET Frameworkライブラリの2.0からArray.ForEachなんてのが出来たらしいけど、これ戻り値無いんだよね。んで、渡すジェネリックの定義も値渡しだから配列を書き換えるメソッドも渡せない。まあそりゃ無茶な気もするけど。どうにかならないのかしら。