Ruby`downcase!`返回`nil`

时间:2017-01-23 01:10:53

标签: ruby

使用此代码:

input = gets.chomp.downcase!
puts input

如果输入中至少有一个大写字母,输入将被放在屏幕上,没有其大写字母。但是如果输入没有大写字母,它将放置nil,就像没有写入任何内容一样。

我希望我的输入完全落后;如果它是一个没有大写字母的字符串,它应该返回相同的字符串。

我想到了这样的事情:

input = gets.chomp
if input.include(uppercase) then input.downcase! end

但这不起作用。我希望有人知道我应该怎么做。

3 个答案:

答案 0 :(得分:6)

根据字符串的文档: (强调是我的补充)

  

<强> downcase

     

返回str 的副本,所有大写字母都替换为小写字母。该操作是区域设置   仅对不敏感的字符“A”到“Z”受到影响。注意:案例   替换仅在ASCII区域有效。

     

downcase!

     

如果没有进行任何更改,则下载str的内容,返回nil 。注意:案例替换仅在ASCII中有效   区域。

基本上它表示如果没有大写字母, downcase!(带感叹号)将返回nil

修复程序:

input = gets.chomp.downcase
puts input

希望有所帮助!

答案 1 :(得分:5)

这将有效:

input = gets.chomp.downcase
puts input

<强>字符串#downcase

返回修改后的字符串,并保留原始未修改的字符串。

str = "Hello world!"
str.downcase # => "hello world!"
str          # => "Hello world!"

<强>字符串#downcase!

修改原始字符串,如果未进行任何更改,则返回nil;如果进行了更改,则返回新字符串。

str = "Hello world!"
str.downcase! # => "hello world!"
str           # => "hello world!"
str.downcase! # => nil

<强>! (爆炸)方法

使用! /非!变体的Ruby方法以类似的方式运行是很常见的。有关原因的深入解释,请参阅this post

答案 2 :(得分:1)

downcase!返回nil的原因是您知道对象是否已更改。如果您将修改后的字符串分配给另一个变量(例如您在此处),则应使用downcase代替(不使用爆炸!)。

如果您不熟悉,标准库爆炸方法通常直接作用于接收器。这意味着:

foo = "Hello"
foo.downcase!
foo #=> "hello"

对此:

foo = "Hello"
bar = foo.downcase
foo #=> "Hello"
bar #=> "hello"