3

三項式の代わりに if/else ステートメントを使用すると、このブロックはどのようになりますか?

戻り値 == null ? 名前.ローカル? attrNullNS : attrNull : 値の型 === "関数" ? 名前.ローカル? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;

(別の15個の同様のブロックに取り組む前に、これを行うことを確認したい...理想的には、そのようなブロックをすべて正規表現に置き換えたいのですが、方法がないようです? 条件演算子をif/elseに自動的に置き換えます? )

4

3 に答える 3

2

良い質問。

まず第一に、このコードを残した開発者は LART されるべきであることに同意します。

ただし、条件演算子の構文がorであり、可能な最長一致が winsであると考えれば、( Eclipse JSDTなどのコード フォーマッターなしで) これを理解できます。LogicalORExpression ? AssignmentExpression : AssignmentExpression… : AssignmentExpressionNoIn

同じアトミック条件演算に属する隣接する式は、文法で許可されていないため、両側?s または:s で区切ることはできません。したがって、ECMAScript 文法に従って機能する LL(n) パーサーの立場に身を置くだけです ;-) 「このコードは、そのゴール シンボルの生成によって生成できるか?」という質問を繰り返し自問してください。答えが「いいえ」の場合は、可能な限り短い一致に戻るか、生成が機能しない場合は構文エラーで失敗します。

  1. return (value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant);
  2. return (value == null ? (name.local ? attrNullNS : attrNull ) : (typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant));
  3. return ((value == null) ? (name.local ? attrNullNS : attrNull) : ( (typeof value === "function") ? (name.local ? attrFunctionNS : attrFunction) : (name.local ? attrConstantNS : attrConstant)));

など:

if (value == null)
{
  if (name.local)
  {
    return attrNullNS;
  }
  else
  {
    return attrNull;
  }
}
else
{
  if (typeof value === "function")
  {
    if (name.local)
    {
      return attrFunctionNS;
    }
    else
    {
      return attrFunction;
    }
  }
  else
  {
    if (name.local)
    {
      return attrConstantNS;
    }
    else
    {
      return attrConstant;
    }
  }
}

(CMIIW.) これはさらに次のように縮小できます。

if (value == null)
{
  if (name.local)
  {
    return attrNullNS;
  }

  return attrNull;
}

if (typeof value === "function")
{
  if (name.local)
  {
    return attrFunctionNS;
  }

  return attrFunction;
}

if (name.local)
{
  return attrConstantNS;
}

return attrConstant;
于 2013-02-04T19:52:54.380 に答える
0

三項演算子を置き換えるだけでこれは非常に高速になりましたが、次のようになると思います。

if (value == null) {
    if (name.local) {
        return attrNullNS;
    }else{
        return attrNull;
    }
}else if (typeof value === "function") {
    if (name.local) {
        return attrFunctionNS;
    }else{
        return attrFunction;
    }
}else{
    if (name.local) {
        return attrConstantNS;
    }else{
        return attrConstant;
    }
}
于 2013-02-04T18:46:48.643 に答える
0

三項演算子とブロックレスの if-else ステートメントの構文 (「グループ化」) は非常に似ているため、それぞれを に、それぞれを に置き換えることから始めること… ?if (…)でき:ますelse。次に、ステートメントをそれぞれにラップし、return自動インデントを使用します。自動置換を使用して、これらのタスクのいくつかを慎重に (段階的に) 実行することもできます。あなたはで終わるでしょう

if (value == null)
    if (name.local) 
        return attrNullNS;
    else
        return attrNull;
else if (typeof value === "function")
    if (name.local)
        return attrFunctionNS;
    else
        return attrFunction;
else if (name.local)
    return attrConstantNS;
else
    return attrConstant;
于 2013-02-04T20:05:17.493 に答える