簡體   English   中英

Ruby Logic與Nil的比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM