よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

March 02, 2003

[Ruby] オブジェクトのコピー

久しぶりにハマったのでメモしておこう。

1: h = Hash["test", "a"]
2: ret = h["test"]
3: ret << "b"
4: p ret  #=> "ab"
5:
6: p h["test"]  #=> "ab"

オレが期待していたのは、6行で"a"が返ってくることだったんだけど、上に書いてあるとおり、実際は"ab"が返る。

これは2行目のretが指しているのがh["test"]のポインタそのもので、3行目でh["test"]の値自身にconcat(<<)しちゃうから、結果として、6では"ab"になるということだ。

回避策としては以下の2つかな。

  • 2行目でret = h["test"].clone(or dup)としてretにはh["test"]内のデータのコピーを作ってそれを使う
  • 3行目で破壊的なメソッド(concat)ではなくコピーを作るメソッド(+=)を使う

上記例だと簡単に問題箇所がわかるけど、ちょっと複雑なコードで1度Hashから取り出した情報を(コピーするの忘れて)使い回し続けるとハマりそう、ってかそれでハマったんだけどね〜。

#そういうのオレだけ?(^^;)

[tDiary] Wikiスタイル

まだ慣れないなぁ(T_T)。段落内で#p01とかつけるのってどうすれば良いのだろう。

[Ruby] 久しぶりにハマったと書いたけど

実はRubyでコード書くこと自体が久しぶりなのかも(^^;)。

[Ruby] 八声のフーガ, Simon Cozens

ruby-talkでSimon Cozensって人を見るたびにサイモン&ガーファンクルと昔1曲だけ有名になった(2曲目もか?)カズンズっていう二人組のミュージシャンを密かに思い出しては含み笑いをしてしまうのだが(恐い)、なかなかおもしろいことを書いていた。

議論好きの英語圏の人はああいう話が好きなのかと思ってたのだけど、うんざりしている人もいるのね〜。

っていうかそれを小粋に訳す方(SugHimsiさん?)もさすがだ。

ちと話は変わるんだけど、最近ますます英語のドキュメント不足を嘆く声が挙がってきてる割には自分で訳そう(あるいは1から作ろう)って人がそれほど多くない気がする。まぁ、日本語読めなきゃできないっつーのもわかるんだけどさ。

#これを機会に日本語話せる人が増えたらおもしろいんだけどなぁ。


March 02, 2004

[Ruby] ObjectPool by さかいさん

元々、オレの作ったものを使ってみて、いろいろ問題がありそうなところを直していったら別物になったというモノ(^^;)。

オレのより全然良いのでオレの方は公開取りやめようかな。RAAのエントリも一度削除した方が良いのかしらん。

それとも同じ名前でそのままメンテナンスも引き継ぎます? > さかいさん

にしても、オレが公開するRuby関連のライブラリでさかいさんの手が入っていないのはないな。Ruby-GNOME2しかり、Ruby-GetText-Packageしかり(^^;)。

[Misc] orkut

なにやら方々で話に出てるので何モノかと思ってたんだけど、一緒に仕事してる人から招待されたので入ってみた....。

が、しかし。いったい、これでオレに何をしろと????(オヤヂ化?)

[Ruby] 予約語の扱い

Ruby/GLibではプロパティ値からアクセッサ(foo=, set_foo, foo)というメソッドを自動生成するんだけど、そのときに予約語が入っている場合を想定していなかった。

irb(main):011:0> RUBY_VERSION
=> "1.9.0"
irb(main):012:0> def if=(val); p val; end
=> nil
irb(main):013:0> if = 10
SyntaxError: compile error
(irb):13: syntax error
if = 10
    ^
        from (irb):13
irb(main):014:0> self.if = 10
10
=> 10
irb(main):015:0>
irb(main):001:0> RUBY_VERSION
=> "1.6.8"
irb(main):002:0> def if=(val); p val; end
SyntaxError: compile error
(irb):2: parse error
def if=(val); p val; end
       ^
(irb):2: parse error
        from (irb):2
irb(main):003:0>

というわけで、今までCVS版のRubyを使っていたので気づかなかったんだけど1.6系でRuby-GNOME2は動かなかったのね...。いかにテストできていないかバレバレだ(^^;)。まぁ、見つけちゃった以上、なおさんといかんなぁ。

#そろそろ1.6系は捨てたいというのがホンネなんだけど。

[Ruby] 予約語の一覧

とかって、定数値として定義されてたっけ?

RUBY_RESERVED = ['if', 'for', ....]

みたいな。

あるとこんなときに使えて便利かも。まぁ、自分で配列(今回はHashの方が良いかな)書けば良いのか。


March 02, 2005

[Ruby-GNOME2] Rucd

ルシード、と読むそうです。Ruby/GTK2で書かれたCDからのリッピング(cdparanoia)、MPエンコード(lame)を行うGUIフロントエンドとのこと。


更新 設定