MetaProgramming Chapter5

来源:互联网 发布:数据分析与处理 编辑:程序博客网 时间:2024/06/07 11:20

MetaProgramming Chapter5

Ruby 元编程 第五章

该文档包含Ruby方法的介绍。

阅读文档,你将学到:


当前类

class C  def m1    def m2      puts "m2"    end    puts "m1"  endendclass D < C  def m3    puts "m3"  endendobj = D.newobj.m1obj.m2obj.m3C.instance_methods(false)D.instance_methods(false)

NOTE:在类中定义的另一个方法,属于当前类

Module#class_eval

类实例变量

在类中定义的实例变量,属于类,而不属于类的实例对象的实例变量

类实例变量:

@var = 'Object的类实例变量@var'class A  @var = 2  puts 'A的类实例变量@var' end

类变量:

@@a = '在Object类中定义的类变量'class B  @@a = '在B类中定义的类变量会改变在超类定义的同名类变量,因为它不属于类'  puts @@a endclass C  puts @@aend

QUESTION: $,@@,@的作用域

NOTE: 如何不知道类名的情况下打开类?,用class_eval或instance_eval

NOTE: class与class_eval的对比
- class关键字只能使用常量,class_eval可以使用任何代表类的变量
- class会打开一个新的作用域,当前的绑定则不可见, 而class_eval使用扁平作用域

NOTE: 让我们回顾一下instance_eval,与class_eval做个比较
instance_eval可以访问当前对象的私有方法和实例变量,仍然可以看到定义时的绑定,如下面的a的实例变量

class A  def initialize    @v = 1  endenda = A.newa.instance_eval do  self  @vendv = 2a.instance_eval { @v = v }a.instance_eval { @v }

NOTE: class_eval和instance_eval的对比
- instance_eval打开非类对象,class_eval打开类定义,然后用def定义方法

class Bendb = Bb.class_eval do  @b = 'B的类实例变量'  def method_b    @b    @c = '类定义的@b属于类,不属于类的实例对象,找不到啊,找不到'    puts 'B的实例方法'    puts @b    puts @c  endend bb = B.newbb.method_b

单件方法Singleton Method

NOTE: 让我们来看看单件类到底是个什么鬼

class A  def self.singleton_method    "这种类方法定义就是在定义单件方法"  endenda = Aa.singleton_methodA.singleton_methods

单件类

class A  def self.a_method    "类方法A#a_method"  end  class << self    def b_method      "类方法A#b_method"    end  endendA.a_methodA.b_method
class B < AendB.a_methodB.a_method

有单件类的方法查找

B.classB.singleton_classB.superclassB.singleton_class.superclass

NOTE: Class是单件类#BasicObject的超类,所以,所有的单件类都可以继承Class的实例方法

class Class    def d      puts 'Class类的类方法'    endendclass DendD.ddd = D.newdd.d

Object

NOTE: 单件类使子类可以调用父类的类方法

类方法的语法

def MyClass.a_class_method; endclass MyClass  def self.another_class_method; endendclass MyClass  class << self    def yet_another_class_method; end  endend

include 和 extend

  • include module实例方法
  • extend module类方法
原创粉丝点击