近来学习ruby的过程中,看到了拟态方法的概念,感觉很有意思。我们都知道拟态方法在ruby中无处不在,可以让代码更清爽更容易理解,比如obj.my_attribute=""就不必写成obj.my_attribute=(""),而更进一步的,像attr_accessor这样的类宏的实现方式也引起了我的兴趣。看了网上的实现方式,自己动手试了一下。
- class Module
- def var( method_name )
- inst_variable_name = "@#{method_name}".to_sym
- # .to_sym
- p inst_variable_name #:=>:@bar
- define_method method_name do
- instance_variable_get inst_variable_name
- end
- define_method "#{method_name}=" do |new_value|
- instance_variable_set inst_variable_name, new_value
- end
- end
- end
- class Foo
- var :bar
- end
- f = Foo.new
- # p f.bar
- p f.class #:=>Foo
- p f.class.instance_methods(false) #:=>["bar", "bar="]
- f.bar = "good" #:=>"good" method bar=
- p f.bar #:=>"good" method bar
上面的var方法就类似于attr_accessor,对其中的
instance_variable_get用代码进行一下说明:- class Fred
- def initialize(p1, p2)
- @a, @b = p1, p2
- end
- end
- fred = Fred.new('cat', 99)
- fred.instance_variable_get(:@a) #=> "cat"
- fred.instance_variable_get("@b") #=> 99
我们都知道在ruby中:a等价于"a"但用前面的方法会更清爽,并且少写一个符号。
阅读(5185) | 评论(0) | 转发(0) |