これはC++アドベントカレンダー2014の8日目の記事です。 ゲームの修羅場10に投稿した記事で「プログラムの落ちるポイント」の中で 4つほどポイントを紹介したのですが、その中の一つがイテレータ破壊です。 これは、ややこしいので、本の方では軽く触れるだけで終わったのですが、 今回、あたらめて紹介したいと思います。 vectorやmapというコンテナを使う機会は多いのですが、 知らず知らずのうちに破壊されたイテレータを使っていることがあります。 まずイテレータ破壊について簡単に書きます。 void foo(){ std::vector<int> a = {1, 2, 3, 4, 5}; auto it1 = a.begin(); a.push_back(6); std::cout << *it1 << std::endl; } こういうソースがイテレータ破壊の例となります。 vectorの場
delete_if {|x| ... } -> self[permalink][rdoc][edit] reject! {|x| ... } -> self | nil delete_if -> Enumerator reject! -> Enumerator 要素を順番にブロックに渡して評価し、その結果が真になった要素をすべて削除します。 delete_if は常に self を返しますが、reject! は要素が 1 つ以上削除されれば self を、 1 つも削除されなければ nil を返します。 ブロックが与えられなかった場合は、自身と reject! から生成した Enumerator オブジェクトを返します。返された Enumerator オブジェクトの each メソッドには、もとの配列に対して副作用があることに注意してください。 例 a = [0, 1, 2, 3, 4,
びっくりマークがついてないので、非破壊的メソッドだと思ってコード書いてたら、どうもオカシイのでよく調べてみたら破壊的メソッドだった。ハマった name = "takuya" #=> "takuya" name.insert(1,"#") #=> "t#akuya" puts name #=> "t#akuya" ←これは。。。 対策。cloneするべ name = "takuya" name.clone.insert(1,"#") #=> "t#akuya" puts name #=> "takuya" 対策:モンキーパッチだろここは class String alias_method :insert!, :insert def insert(a,b) self.clone.insert!(a,b) end endこれで期待通りになった。 ?> name = "takuya" => "ta
■ 破壊的メソッドとは Stringクラスのインスタンスメソッドなどで定義されている、インスタンス自身を変更するメソッドです。 たとえば文字列の末尾に含まれる改行を消したい場合、 irb> text = "テスト\n" irb> text.chomp #=> "テスト" irb> text #=> "テスト\n" のように「chomp」メソッドを使って実現できます。このときインスタンスであるtext自体に変更はなく、「chomp」のあとにtextを呼び出すと改行がついたままであることが確認できます。 これに対して破壊的メソッド「chomp!」の場合は、 irb> text = "テスト\n" irb> text.chomp! #=> "テスト" irb> text #=> "テスト" と、text自体に変更が加わっていることがわかります。 本稿では、このような破壊的メソッドを自分で定義する
As a novice in Ruby, I love its elegance and consistence; it’s now one of my favorite languages. One of my favorite features is the practice of ending the names of mutating methods with an exclamation point to distinguish them from similar accessor methods, like “reverse” vs. “reverse!” I’m curious, though, about an apparent inconsistency with this rule in Array: push, pop, shift, and unshift. All
Hi all, I am relatively new to Ruby, and I am loving it! I have a long Python background, and one of the things I love about Ruby is that it is easier to know and even remember which methods are destructive and which just return a result. Looking through the “String” class methods, one sticks out: “insert”. Almost all others (and all that might be ambiguous), like “delete”, “sub”, etc., have both
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く