2017-01-23 13 views
0

`返します!ルビー `downcase`このコードのnil`

input = gets.chomp.downcase! 
puts input 

を入力中に少なくとも1つの大文字がある場合、入力はその大文字のを除去し、画面上に配置されます。しかし、入力に大文字がない場合は、何も書かれていない場合と同様に、nilとなります。

私の入力を完全に縮小したいと思っています。大文字の文字列でない場合は、同じ文字列を返さなければなりません。

私はこのような何かについて考えた:

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

しかし、これは動作しません。私は誰かがこれをどうやってやるべきかについて考えていることを願っています。

+4

これらの暗い謎の多くは、*ドキュメントを読むことで説明されています。それがそこにあるのです。これは妥当な質問ですが、あなた自身が答えることのできるものでもあります。 – tadman

+1

'downcase!'を使う正しい方法は: 'input = gets.chomp'そして' input.downcase! 'そして最後に' puts input'です – Stefan

+1

あなたが不明な文書の特定の部分について説明できますか?そうすれば、Rubyの開発者は将来のRubyの助けになるようにドキュメントを改善することができます。 –

答えて

6

ストリングためのドキュメントによれば:

downcase (強調は私が追加される)

すなわち、この手段すべての大文字を小文字に置き換えたstrのコピーを返します。操作はロケールである 敏感でない文字 "A"から "Z"が影響を受けます。注:ケース 置換はASCIIリージョンでのみ有効です。

downcase!

変更がなければ、はnilを返します。。注:大文字と小文字の置換はASCIIの 地域でのみ有効です。

基本的にはダウンケース!(感嘆符付き)は、大文字がない場合はnilを返します。助け

input = gets.chomp.downcase 
puts input 

希望:あなたのプログラムを修正するには

+0

ところであなたが引用した文書は古くなっています。 Ruby 2.4以降、 'String#downcase'は完全なUnicodeをサポートしています。 –

+0

@JörgWMittagは2.4がリリースされましたか?私はまだ2.3を使っています。本当にRVMをインストールする必要があります。 – Punknoodles

+0

はい、4週間前にリリースされました。リリースは常にクリスマスデーです。 –

5

これは動作します:

input = gets.chomp.downcase 
puts input 

のString#は

が変更された文字列を返し、元の無修正を残しdowncase。

ストリング#ダウンケース!

変更が加えられていない場合はnilを返し、変更があった場合は新しい文字列を返します。

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

! (バン)メソッド

!/ !バリアントのRubyメソッドでは、同様の動作が一般的です。理由についての詳細な説明は、 this postを参照してください。

1

downcase!がnilを返す理由は、オブジェクトが変更されたかどうかを知るためです。変更した文字列を他の変数に代入する場合は、ここにあるようにdowncaseを代わりに使用する必要があります(!はありません)。

使い慣れていない場合は、通常、標準ライブラリbangメソッドが受信者に直接作用します。この対

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

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

"標準ライブラリのbangメソッドは、通常、呼び出し元に直接作用します。" - これについての例はありますか?多くのbangメソッドは* receiver *を突然変異させ、いくつかは他の "興味深い"エフェクト(例えば 'Process :: exit!' vs 'Process :: exit')を持っていますが、私は呼び出し元に対してその行為を知らない。実際には、深いメタプログラミングの魔法を除いて、呼び出し元にアクセスすることは全く不可能です。 –

+0

@JörgWMittagおっと。愚かな間違い。一定。 – coreyward

関連する問題