今天群里有人问我自己实现类宏 我就来说说(发现没啥好讲的 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=]