[#43271] rails がこけます — "Hideo Konami" <konami@...>

小波です。

15 messages 2007/03/18
[#43273] Re: rails がこけます — 山崎雄介 <y-yamasaki@...> 2007/03/19

山崎です。

[#43274] rubyスクリプト内で、unixコマンドを実行 — 上間 健 <mugenkai15@...> 2007/03/19

こんにちは、上間です。

[#43286] モジュールのinclude先の名前 — Sato Hiroshi <hirocy.f01@...>

hirocyです.

23 messages 2007/03/22
[#43290] system(wget url) について — Kyoko Sato <k.sato@...> 2007/03/22

お世話になっております。佐藤です。

[#43291] Re: system(wget url) について — Yukiharu Yabuki <yabuki@...> 2007/03/22

こんにちは

[#43293] Re: system(wget url) について — Kyoko Sato <k.sato@...> 2007/03/22

矢吹さん有難うございます。佐藤です。

[#43294] Re: system(wget url) について — Yukihiro Matsumoto <matz@...> 2007/03/22

まつもと ゆきひろです

[#43295] Re: system(wget url) について — Kyoko Sato <k.sato@...> 2007/03/22

まつもとゆきひろさん有難うございます。佐藤です。

[ruby-list:43344] Re: 質問:参照されなくなったデータの行方(ちゃんとGCされたか)を知る方法は?

From: ruby-philia@...
Date: 2007-03-31 07:00:33 UTC
List: ruby-list #43344
こんにちは。ruby-philiaと申します。

たしかにArray#map!を使う方法もあるのですが、結局、手元のプログラムを対応させようとした場合、
charsという配列に入っている要素を取り出してmoveとdrawを実行させていく

chars.each do |char|
  char.move
  char.draw
end

という部分を

char.move if char
char.draw if char

などどしなければいけないか、

nil.move
nil.draw

を空定義してトリッキーに逃げる
とする必要があったためです。ちょっと手間というか追加作業が増えてしまう感じがしてしまいました
。(というようなことを考えたり、こんな議論をしたりする間に完遂してしまうほどの手間なのは内緒で
す。)

別の見方をすれば、
chars.delete(self)が内部的にイテレーション(といったりするのかな?)を用いて削除してされている
であろうと予測されるので、chars中のselfをnilに置き換えるのにmap!というイテレーションを用いて
しまうと、イテレーションという意味では等価に、deleteではその場で消せるものをmap!ではnilに置き
換えて後でcompact!に消してもらうという二度手間になってしまいます。等価なことをするのに、より
複雑にしてしまうのはどうかと考えました。

そう考えると、nilで置き換えるという意味ではindexを用いて直接アクセスした方がイテレーションを
使うよりスマートに感じたりしたわけです。(他との兼ね合いをいろいろ考えてみると実行速度的にはこ
れが最有力では?と予想)

さらには、delete自体が内部でnilに置き換えてcompact!されている疑いもあり、どうせ同じことをする
なら、書きやすい方を選んだ方が…と思ったりしました。

その点.dupを利用すれば、4文字で済んでしまって非常にスマートに感じてしまったのです。
スマートという言葉自体が曖昧すぎるとは思いますが、今回に関しては「なるべく変更の手間をかけず
に結果(実行時のコスト等)を出したい」ということかなと思います。

今回私が持っているプログラムに関しては、

chars.dup.each do |char|
  char.move#内部でchars.delete(char)やchars << XXX.newが行われます
  char.draw
end

と同等のスマートさを持つとするなら、

chars.delete_if{|char|
  char.move_and_destroy? or char.draw#もしくはchar.move and char.dead? or char.draw
}

になるでしょうか。(なかださん、だんさん、こういうのはどうでしょうか?)
もちろん、moveをmove_and_destroy?に内容を書き換えたり、drawが必ずfalseかnilを返すようにすると
いう細工に、かなりの作業は必要になるでしょうが、可読性や機能美や高級言語感といったエレガント
さを感じさせます。英語の文章を書くようにプログラミングできるということは、非常に幸せです。(だ
からRuby好き=ruby-philiaなのですが)

とりあえず、もう少し作業が進みましたら、それぞれの方法を用いた場合の利点や実行時の特性につい
て、比較考察できるのではないかと思っておりますので、楽しみにお待ちください。

他にもアイデアがありましたら、引き続きよろしくお願いいたします。

----- Original Message ----- 
送信者: SAITO Shukaku<shukaku@j-mac.co.jp>
宛先: ruby-list@ruby-lang.org
日付:Saturday, March, 31, 2007, 01:11 PM
件名: [ruby-list:43343] Re: 質問:参照されなくなったデータの行方(ちゃんとGCされたか)を知る方
法は?

> 
> 
> 斉藤秀格と申します。
> 
> 配列の全要素を評価して、特定の条件の場合のみ他の値に置き換える、というこ
> とであれば、Array#map!が使えませんか?
> 
> Array#map!で特定の要素をnilに置き換えておき、Array#compact!でそれを一括
> して削除する、という方法はいかがでしょう?
> 
> At Sat, 31 Mar 2007 02:39:46 +0900,
> ruby-philia@mail.goo.ne.jp wrote:
> > また、nil>compactについては、一旦自分自身をnilに置き換えなければなら
> > ず、eachからeach_with_indexに変更して、deleteの代わりにchars[index] =
> > nilとしておいて、後からcompact!で消してしまうという方法しか私が思いつ
> > かず、余り良いアイデアとは思えなかったというのもあります。この方法だと、
> > indexという変数が増えてしまい、特に理由は無いけどなんとなく嫌だったと
> > いうのが理由です。この方法以外のよりスマートな方法で、nil>compact!がで
> > きるのであれば是非教えてください。
> 
> ■●■ -----------------------------------------------------------------
> ■■■   株式会社ジェイマックシステム         斉藤 秀格(SAITO Shukaku)
> ●■○   電話:011-726-6262  FAX:011-726-6260  mailto:shukaku@j-mac.co.jp
> 

In This Thread

Prev Next