はじめに
ブランクスレート:空白の石版
メソッドがほとんどない空っぽなクラスの事・・・でいいのかな?
必要なメソッドだけにしたい場合とかに使う。
Ruby 1.8.7の頃
必要っぽいメソッド以外をundef_methodで未定義にするという事をしていました。
class BlankSlate
instance_methods.each{|method|
undef_method method unless method.to_s =~ /method_missing|respond_to?|^__|object_id/
}
end
Ruby1.9以降
BasicObjectで一発なんですね!
class BlankSlate < BasicObject ; end
BasicObjectとは?
要約
特殊な用途のために意図的にほとんど何も定義されていないクラスです。
Objectクラスの親にあたります。Ruby 1.9 以降で導入されました。性質
BasicObject クラスは Object クラスからほとんどのメソッドを取り除いたクラスです。
Object クラスは様々な便利なメソッドや Kernel から受け継いだ関数的メソッド を多数有しています。
これに対して、 BasicObject クラスはオブジェクトの同一性を識別したりメソッドを呼んだりする 最低限の機能の他は一切の機能を持っていません。注意
通常のクラスは Object またはその他の適切なクラスから派生すべきです。
真に必要な場合にだけ BasicObject から派生してください。
『真に必要な場合にだけ』
・・・(^q^
実行結果
どちらでもundefined method
(rvmが入ってたり入っていなかったりしますけど(=w=;)
>> BlankSlate.new.methods
NoMethodError: undefined method `methods' for #<BlankSlate:0x106e93228>
from (irb):6
1.9.3p392 :001 > class BlankSlate < BasicObject ; end
=> nil
1.9.3p392 :002 > BlankSlate.new.methods
NoMethodError: undefined method `methods' for #<BlankSlate:0x000000020ec868>
from (irb):2
from /home/*****/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'
両方のバージョンで使うなら?
こんな感じ?
むしろ、もう1.8系とか忘れていいとは思いますが。
使うなら2系ですもんね。
if RUBY_VERSION < "1.9"
class BlankSlate
instance_methods.each{|method|
undef_method method unless method.to_s =~ /method_missing|respond_to?|^__|object_id/
}
end
else
class BlankSlate < BasicObject ; end
end
例
module MyMethods
def hello
puts "hello"
end
end
class Execute < BlankSlate
extend MyMethods
end
Execute.hello
実行結果
hello
Objectを汚したくない場面とかに使ったりするかな〜(=w=