2010/03/08

instance_variable

http://ujihisa.blogspot.com/2009/12/left-hand-values-in-ruby.htmlを読んで試してみたこと。

  1 #!/usr/local/bin/ruby191
  2 # coding: utf-8
  3 
  4 class Diary
  5   def initialize
  6     @title, @date = nil, nil
  7   end
  8   alias [] instance_variable_get
  9   #alias []= instance_variable_set
 10   def []=(i, v)
 11     instance_variable_set(i, v) if i_defined?(i)
 12   end
 13   def i_defined?(i)
 14     instance_variable_defined?(i)
 15   end
 16 end
 17 
 18 d = Diary.new
 19 d['@title'] = "NewTitle"
 20 d['@date'] = Time.local(2010,02,01)
 21 d['@ddd'] = 'ddd'
 22 p d['@title']
 23 p d
 24 # =>
 25 # "NewTitle"
 26 #<Diary:0xxxx @title="NewTitle", @date=2010-02-01 00:00:00 +0900>


initialize をとりさり i_defined? もとりさってみる

 29 class Diary
 30   alias [] instance_variable_get # instance_variable_defined?
 31   alias []= instance_variable_set
 32 end
 33 
 34 d = Diary.new
 35 d['@title'] = "NewTitle"
 36 d['@date'] = Time.local(2010,02,01)
 37 p d

% ./try.rb
#<Diary:0xxxx @title="NewTitle", @date=2010-02-01 00:00:00 +0900>

勉強になった。

self.instance_variable_set
にしなくちゃいけないと思っていた。
instance_variable_set
だけで動くなんて知らなかった!

alias [] instance_variable_get
これでinstance の値をとれるなんて!

instance_variable_get
のところを
alias [] instance_variable_defined?
に変えてみたら値をとるかわりに定義されているか否かを true or false で返してくれた!びっくり。

alias [] instance_variable_get
alias []= instance_variable_set
alias [] instance_variable_defined?

のようなことをしてみたくなったが
[] methods
は1度使ってしまったら2個目は使えない。の overwrite されちゃう。あたりまえかも。
1回目の [] と
2回目の [] を
区別させる方法はない? ぽい。

0 件のコメント: