48

さんのソース コードを調べRaphael.jsて、RGB 値を HSB に変換する方法を調べました。私は彼がそれを行った関数を見つけ、それを Python に変換している最中に、この素​​敵な 3 重にネストされた三項演算子に出くわしました。

H = (C == 0 ? null :
    V == r ? (g - b) / C :
    V == g ? (b - r) / C + 2 :
             (r - g) / C + 4
    );

Python には Javascript と同じ種類の三項演算子がないため、ループに陥りました。私はしばらくそれを見て、最終的にこのやや健全なコードを(if/elseのみを使用して)ハッシュしました:

if (C == 0) {
    H = null;
} else {
    if(V == r) {
        H = (g - b) / C;
    } else {
        if(V == g) {
            H = (b - r) / C + 2;
        } else {
            H = (r - g) / C + 4;
        }
    }
}

私の解釈は正しかったですか?私がこれを尋ねているのは、それが正しくない場合、多くのデバッグに直面するからです。そう。「わかった」の?

4

9 に答える 9

46

私の個人的な好みでは、慎重に配置されたネストされた 3 項式は、if-else の混乱を打ち負かします。

const H =
  C == 0 ? null            :
  V == r ? (g - b) / C     :
  V == g ? (b - r) / C + 2 :
           (r - g) / C + 4 ;
于 2016-09-02T19:00:54.840 に答える
35

深いネスティングを避けるためにこれを使用できると思います:

var H

if(C == 0){
    H = null;
}
else if(V == r){
    H = (g - b) / C;
}
else if (V == g){
    H = (b - r) / C + 2;
}
else {
    H = (r - g) / C + 4;
}
于 2012-05-10T02:26:33.877 に答える
7

同じロジックをより簡単な方法で記述できます。

var H

if (C == 0)
    H = null;
else if (V == r)
    H = (g - b) / C;
else if (V == g)
    H = (b - r) / C + 2;
else
    H = (r - g) / C + 4;

各条件に 1 つのステートメントがあるため、中かっこを省略できます。条件が相互に排他的であることを考えると、使用は入れ子selse ifよりもはるかに明確です。if

于 2012-05-10T02:27:03.627 に答える
3

はい、そのとおりです (大文字と小文字の違いは別として)。それでも、かっこなしで書かれたほうがすっきりしていて、elseif のように読めます。

if (C == 0)
    h = null;
else if (V == r)
    h = (g - b) / C;
else if (V == g)
    h = (b - r) / C + 2;
else
    h = (r - g) / C + 4;
于 2012-05-10T02:30:11.567 に答える