2015-12-14 101 views
2

所以,我遇到了这个问题,我希望在例程继续之前检查三个条件,但它会一直抛出语法错误,表示它并不期望多个条件。现在,我知道我见过别人用线,如:红宝石 - 在一条线上使用多个条件

if x > 100 && x % 2 == 1 
    #Do something 
end 

但是,不管是什么原因,这条线:

if (letters.eql? letters.upcase && dash.eql? '-' && numbers.to_i.to_s.eql? numbers) 

被投掷的错误吨。这与'.eql?'有关吗?或者对于我还没有遇到过的Ruby而言,这是多余的?

下面的代码作参考休息:

print "Enter license plate: "; 
input = gets.strip; 
if input.length == 8 
    letters = input[0,2]; 
    dash = input[3]; 
    numbers = input[4,7]; 
    if (letters.eql? letters.upcase && dash.eql? '-' && numbers.to_i.to_s.eql? numbers) 
     puts "#{input} is a valid license plate." 
    else 
     print "All valid license plates are three (3) uppercase letters, followed by a dash (-), followed by four (4) digits"; 
    end 
else 
    print "All valid license plates are 8 characters long."; 
end 

而且,这些都是错误的:

LicensePlate.rb:7: syntax error, unexpected tSTRING_BEG, expecting ')' 
...? letters.upcase && dash.eql? '-' && numbers.to_i.to_s.eql? ... 
...        ^
LicensePlate.rb:7: syntax error, unexpected tIDENTIFIER, expecting ')' 
... numbers.to_i.to_s.eql? numbers) 
... 
+0

你得到了什么错误? – ivan

+1

使用括号'letters.eql?(letters.upcase)&& dash.eql?(' - ')&& numbers.to_i.to_s.eql?(numbers)'现在它试图查看是否有'letters ==(letters .upcase && dash ==(' - '&& numbers.to_i.to_s.eql?numbers))' – engineersmnky

+0

@lurker在Ruby中调用方法时,优先级如何影响括号的必要性? –

回答

2

这应该这样做:

if letters.eql?(letters.upcase) && dash.eql?('-') && numbers.to_i.to_s.eql?(numbers)

您仍然可以包裹在括号中的整个条件,如果你想,但与红宝石(不同的JavaScript),你不需要。

+0

你能解释为什么会出现这种情况吗?这确实解决了我的问题,但是解释对于未来发现这个问题的人有帮助。 –

+0

@JeffreyGreen在我看来,这只是Ruby的一种语言,它倾向于灵活的语法。如果你发现它更具可读性,用圆括号包装整个事物,那就去做吧,它会起作用!如果你想利用Ruby的灵活性,你可以不用考虑。 –

5

认为你只是缺少一些括号 - 试试这个:

if (letters.eql?(letters.upcase) && dash.eql?('-') && numbers.to_i.to_s.eql?(numbers))

+0

好吧,那么.eql发生了什么?是调用一个方法,当在同一行上调用多个方法时,你必须包含括号'?有这个原因吗? –

3

这也适用于:

letters.eql? letters.upcase and dash.eql? '-' and numbers.to_i.to_s.eql? numbers 

我相信这是由于运算符优先级,因为这也适用:

(letters.eql? letters.upcase) && (dash.eql? '-') && (numbers.to_i.to_s.eql? numbers) 

红宝石似乎试图过早地评估你的条件。

编辑:刚才看到Lurker先前提到的优先顺序。

1

除了其他的答案 - 考虑使用regular expression检查格式:

print "Enter license plate: " 
input = gets.chomp 
if input.length != 8 
    puts "All valid license plates are 8 characters long." 
elsif input !~ /^[A-Z]{3}-\d{4}$/ 
    print "All valid license plates are three (3) uppercase letters, followed by a dash (-), followed by four (4) digits" 
else 
    puts "#{input} is a valid license plate." 
end