1

私はレガシーコードで次のことを見つけました:

"myString".sub(/^(.)/) {$1.upcase}非常に奇妙に思えます。IRBで実行している間、私は同じ結果を得ました"myString".capitalize

ドキュメントを見つけることができませんでした...だから最終的にSOになりました

4

3 に答える 3

3

ではない正確に、

 "myString".capitalize
 #=> "Mystring"

 "myString".sub(/^(.)/) {$1.upcase}
 #=> "MyString"

ドキュメントからcapitalize

最初の文字を大文字に、残りを小文字に変換した str のコピーを返します。注: 大文字と小文字の変換は ASCII 領域でのみ有効です。

于 2013-09-24T02:48:32.747 に答える
1

sub置換パラメーターの代わりにオプションのブロックを受け入れます。指定された場合、サブマッチをグローバル変数に配置し、ブロックを呼び出し、文字列の一致部分をブロックの戻り値で返します。

問題の正規表現は、行頭の最初の文字を見つけます。$1サブマッチに含まれているため、その文字を に配置し()、 を返すブロックを呼び出します$1.upcase

余談ですが、これは文字列を大文字にする脳死の方法です。知らなかった場合.capitalizeや、このコードが利用可能になる前 .capitalize(?) からのものである場合でも、単純にmyString[0] = myString[0].upcase. 唯一の利点は.sub、文字列が空の場合にメソッドが機能し、そこで""[0].upcase例外が発生することです。それでも、その問題を回避するより良い方法は、myString[0] = myString[0].upcase if myString.length > 0

于 2013-09-24T02:44:13.263 に答える
0

どちらもまったく同じではありません。subは、指定されたパターンの最初の出現を置き換えるために使用されますが、gsubはすべての出現に対してそれを行います (つまり、グローバルに置き換えます)。

あなたの質問では、正規表現は最初の文字で$1あり、に置き換えられ$1.upcaseます。

コード :

"myString".sub(/^(.)/) {$1.upcase}

出力:

"MyString"

コード :

"myString".capitalize

出力:

"Mystring"
于 2013-09-24T02:46:56.977 に答える