我试着写一个循环来计算一个单词中大写的数量。当我运行此代码时,我收到一个错误,指出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
问候帕特里克
答案 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
表示c1
和c2
之间的所有字符。