0

puts 'A'.upcase! nil を返します。特に 'Ab' は 'B' ではなく 'AB' を返すため、これはちょっと混乱します。これはバグですか、それとも言語の癖ですか?

編集 してドキュメントを表示しますが、それでも直観に反するようです。実際の使用シナリオでこれが意味を持つのはいつですか? 私はそれが助けになるよりも多くの問題を引き起こしているのを見ることができました

編集ティホムの答えは最高のようです。彼が言及している投稿とコメントから、Matz と Ruby 開発チームは、話し言葉での連鎖メソッドの感性よりも、データ型の整合性 (文字列は不変であるべき) の一貫性に動機付けられている可能性が高いことがわかりました。 .

アップケースのようです!単一文字の場合は、実用的な用途がない少し奇妙なアヒルであり、英語を話す人にとっては直感に反する少し病理学的なケースです。Tihom は、Ruby の文字列不変性の優先順位付けの他の例がより合理的であると述べています。

より直感的な例は gsub! で、置換が行われなかった場合は nil を返します。

"abc".gsub!('d','') #=> nil

4

4 に答える 4

2

これには使用upcaseしないupcase!でください(文字列がすでに大文字の場合はupcase!戻ります):nil

puts 'A'.upcase
A
于 2013-10-26T19:48:23.463 に答える
2

文字列#大文字!

str の内容を大文字にし、変更がない場合は nil を返します。

'Ab'.upcase! # => "AB"
# nil returned as receiver is already upcased.
"A".upcase! # => nil 
于 2013-10-26T19:46:19.150 に答える
2

この投稿、特にコメントを読んでください。

実際には、それほど落とし穴ではありません。'!' で終わるメソッドに関する Ruby の規則 メソッドが驚くべきことをするということです。この場合、アップケース!String インスタンスをその場で変更します。したがって、戻り値に依存したり、代入で使用したりしないでください。

規則は次のとおりです。

some_string.upcase!

そのupcase!ため、文字列をその場で変更するため、割り当てで使用することは想定されていません。むしろ、 のように真偽を確認するために使用されif str.upcase!ます。より直感的な例はgsub!で、置換が行われなかった場合は nil を返します:

  "abc".gsub!('d','') #=> nil 
于 2013-10-26T20:40:26.600 に答える
1

ドキュメントによると: http://ruby-doc.org/core-2.0.0/String.html#method-i-upcase-21

upcase!nil変更がない場合は戻ります。

于 2013-10-26T19:46:44.840 に答える