繁体   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