这个块使用if / else语句而不是三元组会是什么样的?
返回值== null? name.local? attrNullNS:attrNull:typeof 值===“功能”? name.local? attrFunctionNS:attrFunction: name.local? attrConstantNS:attrConstant;
(我想确定我在处理另外15个类似的块之前做到了这一点...理想情况下我想用regexp替换所有这些块,但似乎没有方法?Replace conditional operator with if/else automatically? )
答案 0 :(得分:2)
好问题。
首先,我同意向您提供此代码的开发人员应该是LARTed。
但是,如果您考虑Eclipse JSDT和the syntax for the Conditional Operator is LogicalORExpression ? AssignmentExpression : AssignmentExpression
or … : AssignmentExpressionNoIn
,则可以解决此问题(没有the longest possible match wins中的代码格式化程序)。
属于同一原子条件操作的相邻表达式不能由两个侧的?
或:
分隔,因为语法不允许这样做。因此,只需将自己置于LL(n)解析器的位置,该解析器根据ECMAScript语法工作;-)反复问自己“这个代码是否可以由该目标符号的生产产生?”;如果答案为“否”,则回溯到较短的匹配,直到可以,或者如果没有生产工作则会出现语法错误。
return
(
value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant
)
;
return (value == null ?
(
name.local ? attrNullNS : attrNull
)
:
(
强> typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant
的 )
强> );
return (
(
value == null
)
? (name.local ? attrNullNS : attrNull) : (
(
typeof value === "function"
)
?
(
name.local ? attrFunctionNS : attrFunction
{{1} } )
:
(
name.local ? attrConstantNS : attrConstant
)
所以:
));
(CMIIW。)这可以进一步减少到
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;
}
}
}
答案 1 :(得分: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;
}
}
答案 2 :(得分: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;
语句,并使用自动缩进。也许您甚至可以通过自动替换仔细(逐步)完成其中的一些任务。你最终会得到
{{1}}