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
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类方法
阅读全文
0 0
- MetaProgramming Chapter5
- chapter5
- chapter5
- chapter5
- Chapter5
- Template Metaprogramming
- Metaprogramming(1)
- template metaprogramming
- MetaProgramming Chapter4
- MetaProgramming Chapter6
- Chapter5 语句
- chapter5 行列式
- the boost c++ metaprogramming
- MetaProgramming 求π源代码
- 关于元编程(Metaprogramming)
- Functional Programming & Template Metaprogramming
- Metaprogramming in Python
- ruby metaprogramming examples
- $('xx')[0].files[0]是什么意思,Ajax上传文件至springMVC的controller
- poj2406——Power Strings
- display中inline-block和block的区别
- 动物声音模拟器
- JQuery 事件
- MetaProgramming Chapter5
- 梯度下降法
- 达内课程-PrintStream
- 微信公众号机器人开发
- eclipse下SVN同步时忽略target文件夹
- python求最长子串
- Echarts实现地图点击与折线图联动
- 修改Tomcat下项目配置文件
- postman的安装与使用(模拟请求)