为啥 return 语句会破坏条件运算符?
Posted
技术标签:
【中文标题】为啥 return 语句会破坏条件运算符?【英文标题】:Why does a return statement break the conditional operator?为什么 return 语句会破坏条件运算符? 【发布时间】:2011-12-28 02:02:35 【问题描述】:在 ruby 中试验条件运算符,
def nada
false ? true : nil
end
def err
false ? true : raise('false')
end
按预期工作,但是
def reflection
false ? true : return false
end
产生一个syntax error, unexpected keyword_false, expecting keyword_end
def reflection
false ? true : return(false)
end
并尝试使用括号syntax error, unexpected tLPAREN, expecting keyword_end
还
def reflection
false ? true : (return false)
end
按预期工作,更详细的if
...then
...else
...end
def falsy
if false then true else return false end
end
也可以按预期工作。
那么条件(三元)运算符是怎么回事?
【问题讨论】:
【参考方案1】:我认为这都与 ruby 解析器有关。
ruby 将return
解析为三元运算符的 else 表达式
当 ruby 发现 false
而不是 end
时,它会感到惊讶
将 return false
括在括号中会导致 ruby 将整个内容解释为 else 表达式
return(false)
不起作用,因为 ruby 仍在尝试仅将 return
部分解释为 else 表达式,并且在找到左括号时感到惊讶(更新)
注意:我认为这不是一个很好的答案。
例如,一个很好的答案可以参考 ruby 语法来解释解析错误。
【讨论】:
这并不能解释为什么如果你将return false
括在括号中它会起作用。另外:if ... then ... else ... end
也是 ruby 中的表达式。
@sepp2k -- 是的,我想知道 (return false)
是否是 ruby 中的表达式。 ???至于if ... then ... else ... end
,我没有说它不是表达式——我只是说它允许在其中声明。
我对语言背后的设计理念的初步理解是,一切都是一种表达。 ()
=> nil 允许 () || 1
=> 1
@AlexanderWenzowski -- 你可能是对的。我已经更新了我的答案以表明我的不确定性。
re:return 不是函数,但def nope; return(false); end; nope
仍然计算为false
【参考方案2】:
您可以像这样使用它,将整个 return
表达式放在括号中:
def reflection
false ? true : (return false)
end
当然,这样使用没有多大意义,但既然你正在试验(好!),上面的工作!错误是因为我认为 Ruby 语法的工作方式 - 它需要某种结构来形成有效的表达式。
更新
引用draft specification的一些信息:
表达式是组成语句的程序结构(见 12 )。单个表达式可以是作为表达式语句的语句 (见 12.2).12
注意 表达式和语句之间的区别在于 表达式通常用于需要其值的地方,但 语句通常用于其值不一定 必需的。但是,也有一些例外。例如,一个 jump-expression(见 11.5.2.4)没有值,并且值 可以使用复合语句的最后一个语句。
注意。在上面,jump-expression 包括return
等等。
【讨论】:
很奇怪这行得通。我确实想知道它的语法是在哪里定义的。片段添加到问题。 那么(return false)
是否被 ruby 解释为表达式?
在 Ruby 中,几乎所有的东西都表现得像一个表达式。例如,即使您定义了class
,该class
定义中的最后一个“项目”(表达式)也是class
的值(例如puts class Hello; @a = 5;end
将返回5
)。 return
是一个关键字并被认为是一个语句,但 ruby 在许多情况下模糊了这种区别。对于三元运算符,在括号中使用 return
可能满足 ruby 对三元运算符的语法,因为 return
也被视为表达式。
你可能会在this document中找到有用的东西。
sleep
在这种情况下是相同的,例如在:n.times (foo = var_may_not_be_true_yet) ? (return foo) : (sleep 0.1)
【参考方案3】:
三元运算符就是这样,一个运算符。你不会从那里回来。你从函数中返回。当你在 if 中放置 return 时,你会从 if 所在的函数中返回。由于没有变量等待 if 的结果赋值,所以没有问题。当您从三元运算符返回时,变量没有赋值。
【讨论】:
解析你的答案,无论返回语句是否在括号内,我都会从函数返回。在方法中的任何时候调用 return 语句的能力是 ruby 的优点之一。但是我在“没有为变量分配值”时失去了你。不是“一切都是对象”吗?你的意思是条件运算符是一个单独的运算符,而不是从Object 继承的对象? 是的,我说错了。您的操作员前面没有 x =。我应该说表达式没有值(你可以分配给变量但不是。)谢谢你让我诚实。 酷。感谢您抽出时间来回答和回复!以上是关于为啥 return 语句会破坏条件运算符?的主要内容,如果未能解决你的问题,请参考以下文章