2006-03-11から1日間の記事一覧

PI

Mathモジュールをincludeすると、PIが直接使えます。 include Math p PI #=> 3.14159265358979

constants, const_get

Module#constantsで定数の一覧が得られ、Module#const_getで実際の値が得られます。 p Math.constants p Math.const_get("PI") Math.constants.sort.each do |c| puts "#{c} = #{Math.const_get(c)}" end実行結果です。 ["E", "PI"] 3.14159265358979 E = 2.…

Exception

Rubyで、すべてのExceptionをraiseするプログラムを作りました。 Object.constants.sort.each do |c| begin o = Object.const_get(c) if o.class == Class && o < Exception puts "#{o}" raise o end rescue Exception => e end endException =>の部分を指定…

全クラスの階層を表示

ObjectSpaceを使って、全クラスの階層を表示するプログラムを作りました。 subclass = Hash.new ObjectSpace.each_object(Class) do |c| subclass[c.superclass.to_s] ||= Array.new subclass[c.superclass.to_s] << c.to_s end visit = proc { |cname, inde…

引数としてブロックを渡す

Rubyでは、&で修飾した引数を最後に渡して、メソッドにブロックを明示的に渡すことができます。 以下の例は、一つめはブロック付きのメソッド呼び出し、二つめは引数にブロックを渡したもの、三つめはその両方をやろうとしてエラーになるものです。 def ruby…

to_proc

Procオブジェクトでなくても、to_procメソッドを持っているオブジェクトなら、&で修飾した引数としてメソッドに渡すことができます。 class Rubyco def to_proc proc { puts "Hello" } end end def rubyco(&block) block.call end rubyco(&Rubyco.new) #=> H…

UTF8にマッチする正規表現

たつをさんのUTF-8の文字にマッチする正規表現を読んで、なるほどと思いつつ「ビットパターンから生成することもできるのでは?」と感じました。 そこでRubyで書いてみました。こんな風に。 rs = Array.new [ "0xxxxxxx", "110xxxxx 10xxxxxx", "1110xxxx 10…

Procと変数

Procオブジェクトはコンテキストを保持します。 ですから、外部でローカル変数が書き換えられると、Procオブジェクトの中で参照していた変数の値も変化します。 n = 123 p = proc { puts n } p.call #=> 123 n = 456 p.call #=> 456 def rubyco(p, n) p.call…

文字列リテラルとobject_id

Rubyの文字列リテラルは、評価するたびに新しいオブジェクトが作られます。 object_idを調べればそのことが確認できます。 a = 'hello' b = 'hello' c = 'hello' p a.object_id p b.object_id p c.object_id 3.times do p 'hello'.object_id end実行結果です…