美文网首页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自己来实现一个类似的功能)

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

  • From Objective-C to Ruby(4)-类和模块

    类 定义类 OC: ruby: 初始化方法 OC: ruby: 实例变量和属性 OC: ruby: 类方法和对象方...

  • ruby 类

    ruby中任何东西都是一个类,完全面向对象的语言,一个数字也是一个类 定义一个类 然后进入irb命令行

  • iOS内购坑(Ruby服务器验证)

    iOS端 Ruby 因为不懂Ruby,公司又没Ruby技术员,只能自己瞎蒙,代码功能是实现了,但是总感觉哪里写得有...

  • Ruby边学边记

    Ruby边学边记 该篇主要描述类 Ruby定义一个类 以@@开始的是类变量 以@开始的是实例变量 以$开始的是全局...

  • Ruby元编程笔记——1.对象模型

    打开类 在Ruby中,定义类的语句和其他语句没有本质区别,你可以在类定义中放置任何语句。 Ruby的class关键...

  • Ruby中的Module

    Ruby中没有Java语言中的interface,Ruby只支持单继承。Ruby通过Mix-in提供对类的扩展,其...

  • 器-说明:ruby中的原始类和单例类

    一、ruby中的原始类和单例类 在ruby中存在两种类:一个是原始类,一个是单例类。一个对象可以同时有这两种类。 ...

  • ruby类总结

    类 1.new 实例化对象 3. .class查看对象属于哪个类 4. instance_of? 判断对象是否属于...

  • Ruby 创建类

    先看示例: class 语句 class 语句在定义类时使用, 以下是 class语句的一些用法. 类名的首字母必...

网友评论

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

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