与chomp链接时出错

时间:2013-12-27 11:22:37

标签: ruby

我写了一个小程序,如下所示

print "Your string = "
input = gets.chomp.downcase!

if input.include? "s"
   puts "Go yourself!"
end

但是我收到了错误

  

未定义的方法`include?' for nil:NilClass(NoMethodError)

如果我在downcase后删除感叹号(!),程序将正常运行。

我不明白原因。

2 个答案:

答案 0 :(得分:3)

如果字符串已经缩小,

String#downcase!将为您提供nil。所以使用String#downcase,这是安全的。我确定,您从命令行传递给方法gets,这是一个已经下调的字符串。将行input = gets.chomp.downcase!替换为input = gets.chomp.downcase。现在你很安全。

String#downcase

  

返回str的副本,所有大写字母都替换为小写字母。如果接收器字符串对象已经下降,则返回接收器。

String#downcase!

  

下载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