人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: Ryo0524
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● quintia
●50ポイント ベストアンサー

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が返ってくるので、意図しない結果になっていたのです。


2 ● きゃづみぃ
●50ポイント

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

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ