Rubyの replace メソッド
受付中
回答 2
投稿
- 評価
- クリップ 0
- VIEW 2,364
http://docs.ruby-lang.org/ja/2.0.0/class/String.html#I_REPLACE
マニュアルを読むと以下のように書いてあります
str = "foo"
str.replace "bar"
p str # => "bar"
これは 以下となにが違うのでしょうか?
str = "foo"
str = "bar"
p str # => "bar"
replace を使わなければいけないような状況はあるのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+5
replace
は ! はついてませんが 破壊的メソッド です。
これはオブジェクトを共有している時に変化が出てきます。
例えば、次のように定義すると str, str2 は同じオブジェクトを指します。
str = str2 = "foo"
# str → "foo" ← str2
ここで replace を使わない場合は、 新しいオブジェクトを作り str が指しているオブジェクトを変える ので、 str2 の方は変化しません。
str = str2 = "foo"
str = "bar"
p str # "bar"
p str2 # "foo"
# "foo" ← str2
# str → "bar"
しかし、
replace
を使うと、 オブジェクトの中身を変える ので、 str2 の方も変化します。
str = str2 = "foo"
str.replace("bar")
p str # "bar"
p str2 # "bar" 一緒に変わる
# str → "bar" ← str2
そのため、あえて変数を共有しているという場合は、
replace
を使う必要があります。
ただし、基本的に破壊的メソッドの使用は避けるべきなので、 そういう状況にはしない方がいいです。
cf. Ruby 破壊的メソッドについて詳しく教えてください。| teratail
cf. 配列のコピーについて| teratail
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
# replaceを使う場合
a = 'old'
b = a
b.replace('new')
a
# => "new"
# replaceを使わない場合
a = 'old'
b = a
b = 'new'
a
# => "old
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2014/11/19 01:26
そんなことはありませんので、必要に応じて使ってください。
必要性がわからなければ使わなくてもいいですが。
2014/11/19 11:05
一度作成したオブジェクトは変更しない方が、わかりやすく、安全性の高いコードになります。特に並列処理での安全性が上がります。
実際、 そのような理由から .NET, Java, JavaScript などでは、文字列オブジェクトは不変です。
ただ、効率を考えると、オブジェクトを変えた方がよくなります。
例えば、長い文字列の場合 chop と chop! では効率が全然違います。
しかし、 Ruby は Lisp 色が強く、書きやすさを重視した言語です。
効率よりも、わかりやすく、関数型的な方が Ruby としては良いプログラミングだと思います。
これが C, C++ などの質問であれば、私も別のアドバイスをしたと思います。
少なくとも、初心者に積極的に勧める類のものではありません。
2014/11/20 20:24
Stringオブジェクトに限定した話であれば、「初心者のうちは、破壊的メソッドを使うとバグを生みやすいので避けた方がいい」という指導はありだと思います。
いずれはArrayやHash等でエイリアシングによる予期せぬ副作用に直面すると思うので、そのときに改めて学べば良いということでしょうかね。ArrayやHashその他で破壊的メソッドを避けてプログラミングするのは現実的でないので。
私なら、「避けた方がいい」じゃなくて「十分考えて使え」と指導しますが。
2014/11/21 11:19
文字列オブジェクトが不変な方がいいということが本当に理解で聞いているのであれば、同じことが他のオブジェクトにも言えることはわかると思います。
もちろん、 Ruby は関数型言語ではないので、すべてのオブジェクトを不変にするのは難しいです。
破壊的メソッドを使ってはいけないではなく、使うべきじゃないと書いているのは、基本的な方針としてオブジェクトは不変にしておいた方がいいという意図です。
破壊的メソッドを使うか使わないかがわからない、迷うぐらいであれば、そこは使うべきじゃないですし、
使わないと書けないのであれば、何も言わなくても使うはずです。
質問の回答として、 replace の動作の違いをメインにし、破壊的メソッドの方針は一言にとどめています。
そこで長々と説明しても話がぼやけるだけです。なんで と興味をもってもらったのであれば、追加で質問があるはずですし、その時ちゃんと答えればよいと思ってました。
> そんなことはありませんので、必要に応じて使ってください。
> 必要性がわからなければ使わなくてもいいですが。
という書き方は、ちょっと小バカにしたような印象を受けるので、それよりは言葉足らずにしておいた方が追加で質問をしやすいと思います。
2014/11/21 21:08
>使わないと書けないのであれば、何も言わなくても使うはずです。
適材適所で使えば良いと言うことですよね。であれば、賛成です。
オブジェクトを書き換える方法をとるべきか、書き換えない方法をとるべきか迷うのなら書き換えないというのも賛成です。迷わないならいくらでも書き換えればいい。
「基本的に避けるべき」は書き方が悪すぎです。
言葉足らずと受け取る人ばかりでは無い。真に受ける人がいなければいいのですが。
2014/11/22 11:26
設計、コーディングのやり方により、ある程度不変に保っておくことは可能です。
- http://www.h6.dion.ne.jp/~machan/misc/FPwithRuby.html
書き方の問題ではなく、オブジェクトの不変にしておくことの重要性に対して考え方に違いがあるのだと思います。
それについて、これ以上続けても宗教戦争になってくるので、この辺でやめておきます。
2014/11/23 09:31
「基本的に破壊的メソッドの使用は避けるべき」でなく、
「オブジェクトを書き換えるとデバッグが難しくなりバグの元なので、書き換えずにプログラムが書けるならそれに越したことは無い」あたりでしょうか。freezeに触れるとなお良いでしょう。
そこまで長く書くつもりが無いのであれば、最初から言わない方がいい。
「基本的に破壊的メソッドの使用は避けるべき」と書いたときの懸念点は、
再掲ですが、
> 言葉足らずと受け取る人ばかりでは無い。真に受ける人がいなければいいのですが。
「なんかしらんけど、~~~と書いてあった」と思考停止に陥る若者は少なからずいます。