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 件のコメント:
コメントを投稿