K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_24(Tue)

小ネタ。

Ruby で $3 みたいにかくと、$~[3]、つまり Regexp.last_match[3] の略、みたいに動きます。

/(a)(b)(c)/ =~ 'abc'
p $3 #=> 'c'
p $~[3] #=> 'c'
p Regexp.last_match[3] #=> 'c'

さて、何もマッチさせていない時はどうでしょうか。

def foo
  $3
end

p foo #=> nil

該当するものがないので nil が返ります。

さて、先日紹介した allocation_tracer gem を使ってみます。


require 'pp'
require 'allocation_tracer'

def foo
  $3 # return nil        <- ここが 6 行目
end

pp ObjectSpace::AllocationTracer.trace{
  1_000.times{
    foo
  }
}

#=> {["../../trunk/test.rb", 6]=>[1000, 0, 0, 0, 0, 0]}

なんか、メソッドを実行ごとにオブジェクトを生成しています。これ、何かわかりますか?

ヒント:ちなみに、数を増やしてもオブジェクトは増えません。


require 'pp'
require 'allocation_tracer'

def foo
  a = $3 # return nil
  b = $4 # return nil
  c = $~ # return nil
end

pp ObjectSpace::AllocationTracer.trace{
  1_000.times{
    foo
  }
}

#=> {["../../trunk/test.rb", 6]=>[1000, 0, 0, 0, 0, 0]}

ネタばらしをすると、さっき気づいたパフォーマンスバグなんですが、まぁマッチもしていないのに $3 みたいなのを書く人いないから、まぁ問題無いよね。

ちなみに作るのは意外なオブジェクトです。


r49721 で修正した。


好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $