Rubyかつプログラミング初心者です。
学習していると、破壊的メソッドという言葉がでてきました。
普通のメソッドはわかるのですが、破壊的メソッドの意味がさっぱりわかりません。
自身の内容を変更するメソッドとは一体なんですか?
これだけで初心者はわかりませんので、どなたか詳しく教えてください。
宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
「破壊的」というと、ちょっと強い言い方ですが、要は使うとオブジェクトが変更されるメソッドのことです。
例えば、文字列には末尾の文字を削る chop
とその破壊的メソッド chop!
があり、chop!
だけオブジェクトが変更されます。
`
a = "bar"
p a.chop # "ba"
p a # "bar" : 変わらない
p a.chop! # "ba"
p a # "ba" : 変わる
`
分かりづらい原因は破壊的メソッドを特別扱いしてる点にあると思います。なぜ特別扱いしているかというと破壊的メソッドは使うべきではない からです。使うべきじゃないので、呼び方も強い感じになっています。
破壊的メソッドを使うべきではない理由はいくつかあるのですが、その一つを説明します。
次の結果は、少しビックリするような結果ではないでしょうか。
b = a = "bar" a.chop! p a # "ba" p b # "ba" : b も変わっている
これは a, b の変数が同じオブジェクトを指しているからなのですが、分かりづらいし、間違いやすくなります。
なので、注意が必要ということで !
がついて目立つようになっています。
これを破壊的メソッド使わないように書き換えると少し自然な感じになります。
b = a = "bar" a = a.chop # a が指している先を変える p a # "ba" p b # "bar" : b は変わらない
配列の push
のように破壊的だけど !
がついていないメソッドもあります。こういうメソッドは使わないと不便なものが多いです。
Ruby では $ や @ のように「使うべきではないものはないものは汚く見せる」という方針があります。 !
は使わない方がいいというサインとも言えます。
分かりづらいのであれば、とりあえず破壊メソッドの存在を忘れるというのも手だと思います。
投稿2014/08/29 16:03
総合スコア863
0
破壊的メソッド=レシーバーのオブジェクトを書き換えるメソッド
非破壊的メソッド(破壊的メソッドでないメソッド)=レシーバーのオブジェクトを書き換えないメソッド。必要ならコピーして処理される
というような説明が多分入門書に書いてあったと思うのですが、それがわかりにくいと言うことですよね。
たとえ話で説明します。
紙に文字が書いてあったとします。それを修正した物が欲しいときに、
・その紙に書き加えたり、消しゴムで消したりして修正する方法⇒破壊的メソッド
・その紙はそのままにして、別の紙を買ってきて、新しい紙に古い紙を見ながら修正後の文字を書く方法⇒非破壊的メソッド
どちらが良い悪いではなくて、目的によって使い分けます。
違いが出てくる一つは、(他の回答者がプログラムの例で説明していますが)別の人が最初の紙をじっと見ている場合ですね。
元の紙を書き換えると、その紙を見つめている他の人にも変更が伝わります。
別の買ってきた紙に書き込むと、元の紙を見ていた人に新しい紙に書かれたことが伝わりません。
これのどちらが良いのかは、その処理をどういう目的でするかによります。
違いのもう一つは、処理効率です。
紙に100万文字書いてあったとします。その紙の末尾の1文字を消すのと、別の紙に99万9999文字書き写すのとどちらが早いと思いますか?そもそも別の紙を用意するのにも処理コストがかかります。
まあ、「Rubyで書くのに細かい効率を気にするな」と言うのはあるかもしれませんが。
また、破壊的メソッドは ! が付いている物だけではありません。Stringの場合にメソッド一覧から ! の付かない破壊的メソッドを拾ってみると、見落としがあるかもですが、これだけあります。
<<,[]=,concat,clear,force_encoding,insert,prepend,replace,setbyte
この中には、
a << b ⇒ a += b
のように同じような処理をする非破壊的メソッドがある場合もあります。
String以外のクラスでも ! の付かない破壊的メソッドはいろいろあります。
関連した話としては、紙の表面にコーティングしたようにして、その紙の内容を変更不可能にする事もできます。
a.freeze とすると(凍らせるということですね)、aのオブジェクトに対して破壊的メソッドは全部エラーになります。
投稿2014/08/30 00:10
総合スコア84423
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
言語ユーザのための Ruby 入門*1
この記事の最後に破壊的メソッドについて、簡単にまとめられています。
憶えるべき破壊的メソッドの数は、それほど多くはありません。
とりあえず憶えておくと良い破壊的メソッドの条件を示してみます。
末尾に "!" が付いているメソッド。
リスト的な構造を持つクラスにおいて、 特定の要素を追加・削除・変更するメソッド。
オブジェクトそのものを置き換えたり、消去したり、 属性を変更したりするメソッド。
他の言語での破壊的な動作の一つは インクリメンタル演算 (i++ みたいなもの)
ですが、ruby にはインクリメンタル演算はありません。
- Rubyにインクリメンタル演算子がない理由は?
- Rubyにはイテレータが豊富にあり困らないため、インクリメント演算子やデクリメント演算子が実装されていません。 どうしても必要な場合は、"i = i+1"としたり下記のサンプルのようにnextメソッドやsuccメソッドを使用します。
といった記事も読むと良いとおもいます。
投稿2014/08/29 12:22
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そうですね。
破壊的メソッドの意味はそのとおりです。
しかし、大事なことは、他の変数の参照先にも影響します。
確かに初心者の方は、これだけではわかりずらいかもしれませんね。
なるべく詳しく、わかりやすく説明します。
例えば以下のサンプルだとわかるのではないかと思いますので、
よくプログラムを読んでみてください。
`
hennsuu1 = "hennsuu1"
hennsuu2 = hennsuu1 #ここでhensuu1とhennsuu2は同じ文字列"hennsuu1"を参照したことになります。
#ここで破壊的メソッドを理解していただくため
#chopメソッド(末尾1文字を取り除くメソッド)を使って説明します。
p hennsuu1.chop # "hennsuu":hennsuu1の参照先は変更されません。
p hennsuu2 # "hennsuu1"
#ここからが破壊的メソッドです。
p hennsuu1.chop! # "hennsuu": hennsuu1の参照先の変更です。
p hennsuu2 # "hennsuu"
`
chop!メソッドによって、hennsuu2の参照先に影響を与えています。
これで破壊的メソッドの意味・動きが理解できたのではないかと思います。
投稿2014/08/29 07:30
総合スコア139
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/09/01 02:40