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