2014-01-30 19 views
3

文学作品如预期此代码:红宝石三元 - 警告:字符串条件

if phrase.last.eql? "?" ? true : false 
    true 
else 
    false 
end 

但是这个代码使用Ruby三元运算符:

phrase.last.eql? "?" ? true : false 

提供了以下错误:

warning: string literal in condition

我需要以某种方式逃避"?"吗?

+0

甲提醒读者Ruby有三种方法测试相等性: 'puts“#{5 == 5.0},#{5.eql?(5.0)},#{5.equal?(5.0)}”#=> true false false '。 'true'是因为值相同,'false#1',因为值是不同的类型,即使它们是('=')相等,'false#2'是因为值有不同的'object_id'。 –

回答

8

没有括号,红宝石将其解释为

phrase.last.eql?("?" ? true : false) 

这也解释了消息“警告:字符串字面条件”。

为了解决这个问题,使用括号的参数:

phrase.last.eql?("?") ? true : false 

。当然,在这种情况下,使用三元运算符是多余的,因为这是相同的只是

phrase.last.eql?("?") 
+0

+1的清晰解释... – Snowcrash

3

写如下:

phrase.last.eql?("?") ? true : false 

实施例:

2.0.0-p0 :023 > x = "a" 
=> "a" 
2.0.0-p0 :024 > x.eql? "?" ? 1 : 2 
(irb):24: warning: string literal in condition 
=> false 
2.0.0-p0 :025 > x.eql?("?") ? 1 : 2 
=> 2 
2.0.0-p0 :026 > 

否则x.eql? "?" ? 1 : 2被解释为x.eql?("?" ? 1 : 2)。现在在Ruby中除了nilfalse以外的所有对象都是true。因此,这里"?" ? 1 : 2,"?"总是会是true,所以你得到了一个警告。把有史以来的真值条件测试中,没有任何意义,并且同样的警告正在向Ruby解释器抛出。