类定义
定义类或模块时,其自身充当了当前对象self的角色。类和模块也是对象,与方法和块相同,类定义也会返回最后一条语句的值。
当前类
尽管self可以获得当前对象,但并不能获得当前类,每当通过class关键字打开一个类时,这个类就成为当前类。
class_eval方法
class_eval方法像class方法一样重新打开了该类,class关键字会打开一个新的作用域,这将丧失当前绑定的可见性,而 class_eval方法则使用扁平作用域,这意味着可以使用外部作用域中的变量。 class_eval还有个孪生方法 class_exec,它可以接受额外的代码块作为参数。
类实例变量
类的实例变量不同于对象的实例变量。上述代码中一个@my_var变量定义于obj充当self的时刻,它是obj对象的实例变量。另外一个@my_var变量定义于MyClass充当self的时刻,因此它是MyClass的实例变量,也就是类实例变量。
类变量
以@@开头的变量。类变量与类实例变量不同,它可以被子类或者类的实例所使用。
单件方法
仅仅针对str添加的title?方法,其他对象没有这个方法。只对单个对象生效的方法称为单件方法。
类方法
类的单件方法。
类宏
Ruby对象没有属性。如果你希望有一些像属性的东西,就得定义两个拟态方法:读方法和写方法。
这样的写法很容易让人感到枯燥。可以用Module#attr_reader方法生成读方法,用Module#attr_writer方法生成写方法,而Module#attr_accessor可以同时生成两者。像attr_accessor这样的方法称为类宏。
_单件类
p118 ~ p131
方法包装器
方法别名
使用alias关键字可以给ruby方法取一个别名。可以使用符号(例如:m)表示这些名字,也可以使用普通字符串。例如,String#size就是String#length方法的别名;Integer类有一个方法至少有5个不同的名字(大佬告诉告诉我~~)。
但是,如果给一个方法定义别名,又重新定义它。
别名方法引用的还是原始方法。这说明重新定义方法并不是修改这个方法。所以只要老方法还存在一个绑定的别名,仍然可以使用老方法。
网友评论