読者です 読者をやめる 読者になる 読者になる

ループ処理で何もせずにカウンタだけ前に進める

何もせずに次のループに進む

ForループやDoループを書いているとき、

先頭で条件判定して、当てはまっていたら何もせずに次のループに進むことができたらいいのに

と思うことがちょいちょいある。

もちろん、たとえば、

リスト1
For i = 1 to hogehoge
  If foo = "bar" Then
    '処理1
    '処理2
    '処理3
    '処理4
       ・
       ・
       ・
       ・
       ・
  End If
Next

こんな風にしてやれば良いというのは分かっているんだけど、処理が結構な行数に及ぶ場合、Ifブロックがタテに長~くなるのはちょっとイヤなんですよねー。

For(Do)ループ先頭にガード節を置く

最近、ちょっとハマっている「ガード節」という考え方。

入り口のところで門前払いを食らわしてしまう、というのはIfブロックと同じなんですけどね。

たとえば、

スト2
  For i = 1 to hogehoge
    If foo = "bar" Then GoTo myJump    '……(1)
    '処理1
    '処理2
    '処理3
    '処理4
       ・
       ・
       ・
       ・
       ・
myJump:    '……(2)
  Next

こんな感じ。

(1)がガード節に当たる部分で、条件(この場合は変数fooの値が文字列「bar」だったらというもの)に当てはまっていたらNextの直前までワープさせる、というやり方で、処理1、処理2……をすっ飛ばしてiをインクリメントする、という処理を実現している。

おわりに

う~ん……。GoToの行き先になるラベルってインデントが効かない(強制的に左端に戻される)から、For~Nextブロックの視認性が落ちてしまうんだよなあ……。

何かいい方法があったら教えください。

@akashi_keirin on Twitter