我写了一个小程序,如下所示
print "Your string = "
input = gets.chomp.downcase!
if input.include? "s"
puts "Go yourself!"
end
但是我收到了错误
未定义的方法`include?' for nil:NilClass(NoMethodError)
如果我在downcase后删除感叹号(!),程序将正常运行。
我不明白原因。
答案 0 :(得分:3)
String#downcase!
将为您提供nil
。所以使用String#downcase
,这是安全的。我确定,您从命令行传递给方法gets
,这是一个已经下调的字符串。将行input = gets.chomp.downcase!
替换为input = gets.chomp.downcase
。现在你很安全。
返回str的副本,所有大写字母都替换为小写字母。如果接收器字符串对象已经下降,则返回接收器。
下载str的内容,如果没有进行任何更改则返回nil。
证明这一点的一个例子 -
>> s = "abc"
>> p s.downcase
"abc"
>> p s.downcase!
nil
现在nil
是类NilClass
的一个实例,它没有名为#include?
的实例方法。所以你得到了no method error
。这很明显。
>> nil.respond_to?(:downcase)
false
>> nil.respond_to?(:downcase!)
false
>> s.respond_to?(:downcase!)
true
>> s.respond_to?(:downcase)
true
答案 1 :(得分:2)
如果没有对字符串进行任何更改,请不要使用downcase!
,因为它可以返回nil
。
因此,正确的代码将是:
print "Your string = "
input = gets.chomp.downcase
if input.include? "s"
puts "Go yourself!"
end