美文网首页Ruby & Rails
Ruby的类宏。(用ruby自己来实现一个类似的功能)

Ruby的类宏。(用ruby自己来实现一个类似的功能)

作者: 我天真无邪 | 来源:发表于2016-01-12 14:21 被阅读625次

    今天群里有人问我自己实现类宏 我就来说说(发现没啥好讲的 Talk is cheap, show me the code)

    # part 1
    module Mod
      attr_accessor(:one, :two)
    end
    
    # part 2
    Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]
    

    上面这段代码我相信看这篇文章的人是秒懂的 下面来逐步实现一个类似的 attr_accessor

    1: 我们认可 attr_accessor 是一个方法 而且是一个类方法
    2: 基于 1 我们把类当成一个实例(instance)来看 attr_accessor 是类本身的 singleton_method
    3: 我们需要一个模块 引入这个模块的时候能自动帮我们扩展出这个方法

    下面开始属于废话

    4: intance_eval 打开对象 class_eval 打开类 (类名是一个常量 类也是一个对象)
    5: class << obj 打开 obj对象| 打开一个对象 class Abc 打开类 Abc

    代码如下

    module MyModule
      
      def self.included(base)
        base.extend ClassMethods
        base.class_eval do 
          def my_instance_method
          end
        end
      end
      
      module ClassMethods
        def my_attr(str, &blk)
          
          define_method(str) do
            @str
             #instance_variable_set("@#{str}", value)
          end 
          define_method("#{str}=") do |value|
            @str = value
          end
        end
      end
    end
    
    class MyClass
      include MyModule
      my_attr :abc
    end
    
    obj = MyClass.new
    obj.abc = '10'
    puts obj.abc  #10
    
    # part 2
    puts MyClass.instance_methods # [ my_instance_method, abc, abc=]
    

    相关文章

      网友评论

        本文标题:Ruby的类宏。(用ruby自己来实现一个类似的功能)

        本文链接:https://www.haomeiwen.com/subject/gtcckttx.html