三元运算符优先级

时间:2014-02-17 15:00:27

标签: ruby

我在这个例子中使用了三元运算符,它工作正常:

out = 'demo'.start_with?('No information provided') ? 'No information provided' : 'Confidential'

当我将此应用于<<运算符时,我遇到了异常can't convert true into String

out << 'demo'.start_with?('No information provided') ? 'No information provided' : 'Confidential'

为什么会这样?

1 个答案:

答案 0 :(得分:5)

<< has higher precedence then ? operator

所以

out << 'demo'.start_with?('No information provided') ? 'No information provided' : 'Confidential'

实际上是

(out << 'demo'.start_with?('No information provided')) ? 'No information provided' : 'Confidential'

根据错误out是字符串对象,String#<<要求其参数也是字符串。但'demo'.start_with?('No information provided')提供了一个true对象,因此您得到错误'无法将true转换为字符串',因为有(out << true) ? .. : ..之类的语句。

始终使用paren (..)来避免此类优先问题。

out << ('demo'.start_with?('No information provided') ? 'No information provided' : 'Confidential')