• <Ruby>元编程第四章笔记


    1 所有使用def定义的方法都成为当前类的实例方法.
    2 Module#class_eval()方法会在一个已存在类的上下文中执行一个块:

    1 def add_method_to(a_class)
    2  a_class.class_eval do
    3   def m; 'Hello!'; end
    4  end
    5 end
    6 
    7 add_method_to String
    8 "abc".m  #=> 'Hello!'

    3 当self不是一个类时,当前类的角色由self的类来充当.处于顶级作用域时,此时当前类是Object----main对象的类.这也就是为什么当在顶级作用域中定义方法的时候,这个方法会成为Object类实例方法的原因.

    4 如果想打开一个类,并不在乎它是不是类,那么用Object#instance_eval()方法更好,如果是希望打开一个类,那么Module#class_eval()方法是更好的方式.
    5 Ruby解释器假定所有的实例变量都属于当前对象self.在类定义时也是如此:

    1 class MyClass
    2  @my_var = 1
    3 end

    6 类实例变量仅仅可以被类本身所访问----而不能被类的实例或子类所访问.
      类变量可以被类的实例或子类所使用.
      --避免使用类变量,尽量使用类实例变量.

    7

    1 class MyClass
    2  attr_accessor :my_attribute
    3 end

    Module#attr_accessor() , 同时生成读方法和写方法.  像attr_accessor()这样的方法称为类宏.类宏是普通的方法,只是可以用在类定义中而已.

    8 每个eigenclass只有一个实例,并且不能被继承,因此也被称为单件类.eigenclass是一个对象的单件方法的存活之所.
    9 如果对象有eigenclass,那么Ruby不是从它所在的类开始,而是先从这个eigenclass类中开始查找方法.
    10 eigenclass的超类就是超类的eigenclass.

    11 Ruby对象模型的七条规则:
    (1) 只有一种对象--要么是普通对象,要么是模块.
    (2) 只有一种模块--可以是普通模块,类,eigenclass或代理类.
    (3) 只有一个方法,它存在于一种模块中--通常是类中.
    (4) 每个对象(包括类)都有自己的"真正的类"--要么是普通类,要么是eigenclass.
    (5) 除了BasicObject类无超类外,每个类有且只有一个超类.这意味着从任何类只有一条向上直到BasicObject的祖先链.
    (6) 一个对象的eigenclass的超类是这个对象的类;一个类的eigenclass的超类是这个类的超类的eigenclass.
    (7) 当调用一个方法,Ruby先向"右"迈一步进入接收者真正的类,然后向"上"进入祖先链.这就是Ruby查找方法的全部内容.

    12 如果想添加专属于某个指定类的属性,可以在它的eigenclass中定义该属性:

    1 class MyClass
    2  class << self
    3   attr_accessor :c
    4  end
    5 end
    6 
    7 MyClass.c = "It works"
    8 MyClass.c    #=> "It works"

    13 当类包含模块时,它获得的是该模块的实例方法--而不是类方法.模块的类方法存在于模块的eigenclass中.
    14 类扩展:类的eigenclass的实例方法,就是类的类方法
    15 Object#extend() : 用作类扩展和对象扩展,是在接收者eigenclass中包含模块的快捷方式.
    16 alias关键字,给方法取别名.
    alias :m :my_method  //注意是关键字,所以中间没有逗号.
    Module#alias_method()方法, 和alias关键字功能一样.

    17 当重定义一个方法时,并没有真正修改这个方法.相反,会把当前存在的这个方法名字跟定义的新方法绑定起来.只有老的方法还存在绑定的名字,仍旧可以调用它.
    18 环绕别名:
    (1) 给方法定义一个别名
    (2) 重定义这个方法
    (3) 在新的方法中调用老的方法

  • 相关阅读:
    BZOJ-1016 最小生成树计数
    BZOJ-1003 物流运输
    BZOJ-1009 GT考试
    【NOIP2014】伤感·伤感·伤感
    BZOJ-1033 杀蚂蚁
    NOIP一系列模拟赛小结
    2014·NOIP 新的历程,新的开始
    35. Search Insert Position
    29. Divide Two Integers
    28. Implement strStr()
  • 原文地址:https://www.cnblogs.com/leaf526/p/3583310.html
Copyright © 2020-2023  润新知