ヨーキョクデイ

いろいろ雑食

opApply の引数であるデリゲートの戻り値

import std.stdio;

class K{
    private uint[] a = [3, 1, 4];
    int opApply(int delegate(ref uint) dg){
        int result;
        for(uint i; i < a.length; i++){
            result = dg(a[i]);
            writeln("r: ", result);
            if(result){
                break;
            }
        }
        return result;
    }
}

void test1(K k){
    writeln("test1 : normal");
    foreach(e; k){
    }
}
void test2(K k){
    writeln("test2 : continue");
    foreach(e; k){
        continue;
    }
}
void test3(K k){
    writeln("test3 : return");
    foreach(e; k){
        if(e == 1){
            return;
        }
    }
}
void test4(K k){
    writeln("test4 : break");
    foreach(e; k){
        if(e == 1){
            break;
        }
    }
}
void test5(K k){
    writeln("test5 : goto");
    foreach(e; k){
        if(e == 1){
            goto END;
        }
    }
END:
    return;
}
void test6(K k){
    writeln("test6 : throw");
    try{
        foreach(e; k){
            if(e == 1){
                throw new Exception("!!!");
            }
        }
    }
    catch(Exception ex){
        writeln(ex.msg);
    }
}

void main(){
    auto k = new K;
    test1(k);
    test2(k);
    test3(k);
    test4(k);
    test5(k);
    test6(k);
}

という、ループを抜けようとしたりしなかったりする実験をしてみると、結果は次のようになった。DMD 2.025 にてテスト。

test1 : normal
r: 0
r: 0
r: 0
test2 : continue
r: 0
r: 0
r: 0
test3 : return
r: 0
r: 2
test4 : break
r: 0
r: 1
test5 : goto
r: 0
r: 2
test6 : throw
r: 0
!!!