[英]Ruby Logic comparisons with Nil
我無法理解以下代碼:
vowels_arr = ["a","e","i","o","u"]
(0...(vowels_arr.length - 1)).all? {|i| vowels_arr[i] <= vowels_arr[i + 1]}
當我嘗試在沒有-1的情況下運行它時,我得到一個錯誤,說我無法將字符串與nil進行比較。 但我不明白的是,為什么我們甚至需要-1? “......”游俠制造它所以我們只評估“a”,“e”,“i”,“o”(5個中的4個)。 由於總長度為5,我們已經有4個要比較的東西,我的信念是比較(vowels_arr [i] <= vowels_arr [i + 1])應該在沒有-1的情況下工作。
有人可以向我解釋為什么我們需要數組長度后的-1?
還有其他方法在ruby中通過這個比較nil錯誤嗎?
這是因為:
vowels_arr[i + 1]
(0...(vowels_arr.length))
將返回數組的所有索引。
(0...(vowels_arr.length)).to_a # => [0, 1, 2, 3, 4]
但是那時你正試圖從當前的下一個索引。 如果當前索引是最后一個索引(4),則會導致錯誤,因為在期望字符串的位置會得到nil
(因為在不存在的索引處不存在元素)。 這就是為什么你需要length - 1
,以允許你的邏輯不要超出數組的界限。
順便說一句,如果您正在嘗試檢查數組是否已排序,為什么不直接更新?
vowels_arr = ["a","e","i","o","u"]
puts vowels_arr.sort == vowels_arr
# >> true
正如塞爾吉奧所回答的,問題在於vowels_arr[i + 1]
。 變量i
范圍超過了vowels_arr
的索引,因此i + 1
不一定指向現有的vowels_arr
索引。 特別是,當i
到達最后一個索引時, i + 1
將大於現有索引,並且vowels_arr[i + 1]
將nil
。
也正如塞爾吉奧所回答的那樣,如果你的目的是看它是否有分類,那么像塞爾吉奧那樣做的答案很簡單,但在一般情況下,你可以這樣做:
vowels_arr.each_cons(2).all?{|e1, e2| e1 <= e2}
vowels_arr = ["a","e","i","o","u"]
p vowels_arr[vowels_arr.length] #=> nil
(0..(vowels_arr.length)).all? {|i| vowels_arr[i] <= vowels_arr[i + 1]}
#=> `<=': comparison of String with nil failed (ArgumentError)
當你將vowels_arr[vowels_arr.length]
元素傳遞給塊時,它是nil
。 在Ruby
數組中,基於0(zero)
。 因此, vowels_arr.length
給出5
均值元素在(0..4)
的范圍內。 見下文:
vowels_arr = ["a","e","i","o","u"]
p vowels_arr[0] #=> "a"
p vowels_arr[1] #=> "e"
p vowels_arr[2] #=> "i"
p vowels_arr[3] #=> "o"
p vowels_arr[4] #=> "u"
p vowels_arr[5] #=> nil
p vowels_arr[6] #=> nil
(0..(vowels_arr.length))
表示你正在傳遞給塊0,1,2,3,4,5
,並且嘗試訪問5
給出nil
,因為在5th
索引中的數組中為nil
。 看看為什么代碼(0...(vowels_arr.length)).all? {|i| vowels_arr[i] <= vowels_arr[i + 1]}
(0...(vowels_arr.length)).all? {|i| vowels_arr[i] <= vowels_arr[i + 1]}
(0...(vowels_arr.length)).all? {|i| vowels_arr[i] <= vowels_arr[i + 1]}
通過以下調試失敗, each
調試each
看到傳遞給塊的內容:
vowels_arr = ["a","e","i","o","u"]
(0...(vowels_arr.length)).each {|i| p vowels_arr[i],"--",vowels_arr[i+1]}
p (1...3).to_a
輸出:
"a"
"--"
"e"
"e"
"--"
"i"
"i"
"--"
"o"
"o"
"--"
"u"
"u"
"--"
nil
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.