RubyでPGをしているのですが置換について質問があります。


str = "元気なうさぎ"みみ"ちゃん"
という文字列があるとします。
この文中の「"(ダブルクォーテーション)」をすべて「 (半角スペース)」に置換したいと思っています。
この文中では「"みみ"」の両側の「"」を置換することになります。

そこで、以下のようにしてみました
str.gsub!("\""," ")
しかし、こうすると指定した文中に「"」がない場合、strがすべてなくなってしまいました。
なにがおかしいのでしょうか?

たとえば
str1="あああああああああ" → str = str1.gsub!("\""," ") → str = ""
str2="あああああ"あああ"あ" → str = str2.gsub!("\""," ") → str = "あああああああああ"

回答の条件
  • 1人5回まで
  • 登録:2012/04/19 08:45:44
  • 終了:2012/04/19 11:30:29

ベストアンサー

id:quintia No.1

quintia回答回数558ベストアンサー獲得回数672012/04/19 09:09:32

ポイント50pt

gsub メソッドと gsub! メソッドの違いを理解してください。
gsub! は文字列の中身を置き換える(Rubyだと"破壊的メソッド"とよく呼ばれます)ので、やりたかったことは、

str1.gsub!("\""," ") 

が正着です。これだけでstr1の中身が置き換わります。

もしくは、

str1 = str1.gsub("\""," ") 

ですが、こちらは普通は使わないです(意図が見えづらくなっているので)。

!の有無を意識してください。


http://www.namaraii.com/rubytips/?%B5%AD%BD%D2%B7%C1%BC%B0

「破壊的メソッド」という記述があった場合、それはレシーバ自体の値を変更するメソッドであることを示しています。



http://ref.xaio.jp/ruby/classes/string/gsub#h-129075501

戻り値は、置換が行われたときはレシーバ自身、変更がなかったときはnilです。

文字列中に"がない時にnilが返ってくるので、意図しない結果になっていたのです。

その他の回答(1件)

id:quintia No.1

quintia回答回数558ベストアンサー獲得回数672012/04/19 09:09:32ここでベストアンサー

ポイント50pt

gsub メソッドと gsub! メソッドの違いを理解してください。
gsub! は文字列の中身を置き換える(Rubyだと"破壊的メソッド"とよく呼ばれます)ので、やりたかったことは、

str1.gsub!("\""," ") 

が正着です。これだけでstr1の中身が置き換わります。

もしくは、

str1 = str1.gsub("\""," ") 

ですが、こちらは普通は使わないです(意図が見えづらくなっているので)。

!の有無を意識してください。


http://www.namaraii.com/rubytips/?%B5%AD%BD%D2%B7%C1%BC%B0

「破壊的メソッド」という記述があった場合、それはレシーバ自体の値を変更するメソッドであることを示しています。



http://ref.xaio.jp/ruby/classes/string/gsub#h-129075501

戻り値は、置換が行われたときはレシーバ自身、変更がなかったときはnilです。

文字列中に"がない時にnilが返ってくるので、意図しない結果になっていたのです。

id:taknt No.2

きゃづみぃ回答回数13481ベストアンサー獲得回数11982012/04/19 09:14:34

ポイント50pt

それは 仕様だからですね。
http://ref.xaio.jp/ruby/classes/string/gsub#h-129075501

gsub!メソッドは、パターンにマッチした部分をすべて指定の文字列に置換します。レシーバ自身を変更するメソッドです。戻り値は、置換が行われたときはレシーバ自身、変更がなかったときはnilです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません