为什么我在哈希文字中使用三元运算符会出错?

时间:2013-07-14 01:05:16

标签: ruby

执行以下操作会产生错误。

x = ""
h = {:a => x==nil?"":x}

错误:

syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
h = {:a => x==nil?"":x}

是否无法在哈希文字定义中使用三元运算符?

3 个答案:

答案 0 :(得分:7)

在散列字面定义中使用三元运算符没有问题。

x==nil?中,解释程序正在考虑将?nil作为对nil?方法的调用。那么三元运算符的其余部分实际上是一个语法错误,因为你没有一个格式良好的运算符,因为?不是它的一部分。

使用适当的间距输入的内容是:

h = {:a => x == nil ? "" : x}

可以更好地表达为:

h = {:a => x.nil? ? "" : x}

如果false不是x的有效值,您也可以使用@Gareth建议的h = {:a => x || ""}表单

此外,如果x应始终为string,则可以使用@sawa

建议的h = {a: x.to_s}表单

答案 1 :(得分:4)

照顾好空间。 Ruby会将nil?视为方法调用。这有效:

h = {:a => x==nil ? "" : x }

答案 2 :(得分:2)

您也可以(喘气)使用括号,如下所示:

h = {:a => (x == nil)?"":x}

但是你应该在这种情况下添加间距或使用Object#nil?方法。