我寫了一個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
我寫了一個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
你得想想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.' }"
這也是爲什麼歧義發生。比方說,你有兩個功能,x
和a
,像這樣:
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), 2
到x
,或者是你想打電話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
這是一個很好的迴應,也是一個新手想要了解Ruby內部的一個irb/mri gem。 –
試試這個:
age>=21 ? puts("You're over 21!") : puts("You're too young.")
當給定的選項有沒有括號的函數調用時,三元運算符會感到困惑。
你也可以這樣做:
puts age>=21 ? "You're over 21!" : "You're too young."
比做在無條件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_i
或chomp.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!
希望有所幫助。
什麼是確切的語法錯誤? Ruby會告訴你什麼線路正在產生它,並知道這有助於我們幫助你。 –