近来学习ruby的过程中,看到了拟态方法的概念,感觉很有意思。我们都知道拟态方法在ruby中无处不在,可以让代码更清爽更容易理解,比如obj.my_attribute=""就不必写成obj.my_attribute=(""),而更进一步的,像attr_accessor这样的类宏的实现方式也引起了我的兴趣。看了网上的实现方式,自己动手试了一下。
     

点击(此处)折叠或打开

  1. class Module
  2.   def var( method_name )
  3.     inst_variable_name = "@#{method_name}".to_sym
  4.     # .to_sym
  5.     p inst_variable_name #:=>:@bar
  6.     define_method method_name do
  7.       instance_variable_get inst_variable_name
  8.     end
  9.     define_method "#{method_name}=" do |new_value|
  10.       instance_variable_set inst_variable_name, new_value
  11.     end
  12.   end
  13. end

  14. class Foo
  15.   var :bar
  16. end

  17. f = Foo.new
  18. # p f.bar
  19. p f.class #:=>Foo
  20. p f.class.instance_methods(false) #:=>["bar", "bar="]
  21. f.bar = "good" #:=>"good" method bar=
  22. p f.bar #:=>"good" method bar
    上面的var方法就类似于attr_accessor,对其中的instance_variable_get用代码进行一下说明:

点击(此处)折叠或打开

  1. class Fred
  2.   def initialize(p1, p2)
  3.     @a, @b = p1, p2
  4.   end
  5. end
  6. fred = Fred.new('cat', 99)
  7. fred.instance_variable_get(:@a) #=> "cat"
  8. fred.instance_variable_get("@b") #=> 99

   我们都知道在ruby中:a等价于"a"但用前面的方法会更清爽,并且少写一个符号。
09-04 11:16