48

我查看Raphael.js了他的源代码以了解他如何将 RGB 值转换为 HSB。我发现了他所做的函数,当我遇到这个漂亮的三元嵌套三元运算符时,我正在将其转换为 Python:

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

就我个人而言,仔细对齐的嵌套三元组胜过 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 回答
8

如果您的 JavaScript 代码库包含类似问题的嵌套三元语句,请考虑将格式转换为菊花链式三元语句

H = (C == 0)           // Is C zero?
    ? null             // Then return `null`, else ...
    : (V == r)         // Is V equal to r?
    ? (g - b) / C      // Then return this value, else ...
    : (V == g)         // Is V equal to g?
    ? (b - r) / C + 2  // Then return this value
    : (r - g) / C + 4; // Otherwise fall back to this default value

他们只是在一条直线上从上到下读取,一旦遇到真实条件或回退,就会返回一个值。

–<em>嵌套三元组很棒,Eric Elliot

于 2018-04-10T20:20:45.957 回答
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;

可以省略花括号,因为每个条件中都有一个语句。并且鉴于条件是互斥的,使用else if比嵌套ifs要清晰得多。

于 2012-05-10T02:27:03.627 回答
6
H = C == 0 
    ? null 
    : V == r 
        ? (g - b) / C 
        : V == g 
            ? (b - r) / C + 2 
            : (r - g) / C + 4

我见过 Dan Abramov 使用这种缩进放置模式。虽然我不喜欢条件运算符在?视觉上不再遵循条件的方式,但我更喜欢 @lolmaus 的示例,因为无论条件的大小如何,缩进总是一致的。

您实际上开始将其视为?真假:,这在视觉上很直观。通过这种方式,我发现三元组更容易发现并与周围的代码区分开来。

于 2017-02-21T15:46:18.373 回答
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 回答
1

这是另一个更优雅的想法......

if (C != 0) 
{
  if (V == r) return (g - b) / C;
  if (V == g) return (b - r) / C + 2;
  return (r - g) / C + 4;
}

return null;

只需将其包装在函数中并使用而不是 H...

于 2020-04-18T19:12:02.663 回答
0

MDN 文档中所述:

function example(…) {
    return condition1 ? value1
         : condition2 ? value2
         : condition3 ? value3
         : value4;
}

// Equivalent to:

function example(…) {
    if (condition1) { return value1; }
    else if (condition2) { return value2; }
    else if (condition3) { return value3; }
    else { return value4; }
}
于 2020-10-15T11:32:37.103 回答
0

为什么不使用 Python 中的三元运算符?

H = (
    None            if C == 0 else
    (g - b) / C     if V == r else
    (b - r) / C + 2 if V == g else
    (r - g) / C + 4
)
于 2020-10-28T19:54:22.543 回答