2013-10-29 45 views
2

我寫了一個if-then-else的程序,但改變代碼時要使用的三元運算符,我得到一個語法錯誤,無法弄清楚,爲什麼它不會工作:爲什麼使用三元運算符會出現語法錯誤?

def are_you_over_21 
    puts"How old are you?" 
    age = gets.chomp.to_i 
    age>=21 ? puts"You're over 21!" : puts"You're too young." 
end 

are_you_over_21 
+0

什麼是確切的語法錯誤? Ruby會告訴你什麼線路正在產生它,並知道這有助於我們幫助你。 –

回答

13

你得想想Ruby的語法分析器。

這將很好地工作:

age >= 21 ? puts("You're over 21!") : puts("You're too young.") 

的原因是,如果你使用的puts方法,無需支架,解析器並不瞭解:令牌來算賬;它並沒有意識到它與之前的三元運算符有關。你也可以這樣做:

puts age >= 21 ? "You're over 21!" : "You're too young." 

這很好 - 解析器在這裏沒有遇到任何歧義。

你也可以這樣做:

puts "You're #{ age >= 21 ? 'over 21!' : 'too young.' }" 

這也是爲什麼歧義發生。比方說,你有兩個功能,xa,像這樣:

2.0.0-p195 :033 > def x(y) 
2.0.0-p195 :034?> y + 1 
2.0.0-p195 :035?> end 
=> nil 
2.0.0-p195 :036 > def a(b) 
2.0.0-p195 :037?> b + 2 
2.0.0-p195 :038?> end 
=> nil 

括號不會在這裏做一個區別:

2.0.0-p195 :039 > x a 1 
=> 4 
2.0.0-p195 :040 > x a(1) 
=> 4 
2.0.0-p195 :041 > x(a(1)) 
=> 4 
2.0.0-p195 :042 > x(a 1) 
=> 4 

但如果x可能需要不止一個參數的更多?現在,你一定要幫解析器出來:

2.0.0-p195 :043 > def x(y, z) 
2.0.0-p195 :044?> y + z + 1 
2.0.0-p195 :045?> end 

讓我們打個電話,沒有括號像以前一樣:

2.0.0-p195 :047 > x a 1, 2 

你傳遞a(1), 2x,或者是你想打電話a(1, 2)並將結果傳遞到x?按照慣例紅寶石假設你想打電話a(1, 2),但a只需要一個參數,所以你得到一個錯誤:

ArgumentError: wrong number of arguments (2 for 1) 
    from (irb):36:in `a' 

所以你需要括號:

2.0.0-p195 :052 > x a(1), 2 
=> 6 
+0

這是一個很好的迴應,也是一個新手想要了解Ruby內部的一個irb/mri gem。 –

5

試試這個:

age>=21 ? puts("You're over 21!") : puts("You're too young.") 

當給定的選項有沒有括號的函數調用時,三元運算符會感到困惑。

你也可以這樣做:

puts age>=21 ? "You're over 21!" : "You're too young." 
1

比做在無條件puts更好三元,這是一個有條件的陳述,爲什麼不是三元的結果puts

def are_you_over_21         
    puts"How old are you?"       
    age = gets.to_i         
    age >= 21 ? "You're over 21!" : "You're too young." 
end             

puts are_you_over_21 

此外,它是不是一個錯誤,但一些(你的情況整數)的性質意味着它永遠不會需要一個chomp,因爲數字沒有新的生產線。您永遠不需要使用chomp.to_ichomp.to_f

請注意,該方法現在返回String的一個實例,而不是零。現在可以按照需要使用它,在這種情況下,使用puts來顯示給終端。

比較運算符周圍的空格使得它更易於閱讀。

如果您要提示,獲取數據和報告,該方法本身可能不是一種方法。你也可以去除方法定義,並將其作爲運行代碼。

我已經重構這是這個樣子:

def are_you_over_21(age) 
    age >= 21 ? "You're over 21!" : "You're too young." 
end 

[18, 20, 21, 22, 100].each do |age| 
    puts are_you_over_21(age) 
end 

# >> You're too young. 
# >> You're too young. 
# >> You're over 21! 
# >> You're over 21! 
# >> You're over 21! 

希望有所幫助。

相關問題