字符串与nil的比较失败

时间:2014-04-02 11:12:08

标签: ruby string char

我试着写一个循环来计算一个单词中大写的数量。当我运行此代码时,我收到一个错误,指出nil无法与字符串进行比较。我不明白这一点,因为我正在将字符串与字符串进行比较?

passwort = gets.chomp
i = 0
capitals = 0
while(i < (passw0ort.length) + 1) do
    if('A' <= passwort[i] && passwort[i] <= 'Z')
        capitals = capitals + 1
    else
        end
    i = i + 1
end

问候帕特里克

3 个答案:

答案 0 :(得分:1)

你得到nil的原因是你计算的元素数量超过了它。

i<(passw0ort.length)+1应为i<(passw0ort.length),因为如果字符串不为空,.length返回大于零的数字,而数组则为零索引。循环的最后一次运行时,您尝试在字符串后访问元素,该字符串不存在。

因此,在最后一次循环迭代中,您将字符串与nil进行比较,从而导致此错误。

答案 1 :(得分:0)

只需使用scan类的String方法过滤掉大写字母

capitals = passwort.scan(/[A-Z]/).count

答案 2 :(得分:0)

你的循环太长了&#34;长&#34;:

passwort = "test"
i = 0
while i < passwort.length + 1
  puts "passwort[#{i}] == #{passwort[i].inspect}"
  i = i + 1
end

输出:

passwort[0] == "t"
passwort[1] == "e"
passwort[2] == "s"
passwort[3] == "t"
passwort[4] == nil # <- this is your nil error

您可以将i < passwort.length + 1更改为i < passwort.length

来解决此问题

但是,不是使用临时变量和while循环,而是使用String#chars将字符串的字符作为数组,Array#count来计算满足条件的字符:

passwort = "123fooBAR"
passwort.chars.count { |char| 'A' <= char && char <= 'Z' }
#=> 3

或只是String#count

passwort.count("A-Z") #=> 3

来自文档:

  

序列c1-c2表示c1c2之间的所有字符。