如果感谢大家能看到第四篇……
为了答谢各位新老客户,所以本店将赠送大家装X名字一枚:metaclass(我认为面试ruby的话能说出metaclass跟扁平作用域就能说明你对ruby有一定层次的理解了。)
不过首先呢,我们要知道什么是eigenclass。
本人的一贯工作作风就是脏活累活给别人干,所以我就不在这里介绍eigenclass,大家可以自行baidu或者参考http://17test.info/?p=152。
知道了eigenclass了,再告诉你下一个秘密:定义class跟定义方法一样,都有返回值!
turth = class A
"The most xun national wind"
end
puts turth
虽然在class里不能用return,但是最后一句表达式的值却真的有返回。
终于要到正题了:创建类方法。
在class_eval里直接用define_method显然是不行的,define_method只能添加实例方法,但是正如我们第三篇所说,类方法就是这个类作为一个对象(Class的实例)的实例方法,所以只要我们找到这个类的类(我已经厌倦了这种表达……),然后添加实例方法即可……
Klass = Class.new
Klass.class_eval do
define_method :instance_method_for_demo do
puts "This is a instance method for #{self}"
end
self.class.class_eval do
define_method :class_method_for_demo do
puts "This is a class method for #{self}"
end
end
end
Klass.new.instance_method_for_demo
Klass.class_method_for_demo
哈哈大功告成。
不过这样做是不对的。
虽然给Klass添加好了类方法,但是突然发现,所有类都多了一个类方法……
Array.class_method_for_demo
String.class_method_for_demo
因为上面代码中self.class就是Class,所有的类都是Class的子类,所以上面的代码相当于给每一个类都添加了一个方法……what the fxxk
说脏话显然是解决不了问题的,要解决问题首先要知道——问题是什么……
我们需要在Class里添加一个实例方法,但是我希望这个Class只属于我们的Klass……
那么,有没有只属于我们的Klass的Class呢?
eigenclass,该你出场了。
metaclass = (class << self;self;end)
这句代码单独拿出来不好理解,因为我们不知道self是什么,那我们就放进上下文中。
Klass = Class.new
Klass.class_eval do
define_method :instance_method_for_demo do
puts "This is a instance method for #{self}"
end
metaclass = (class << self; self; end)
metaclass.class_eval do
define_method :class_method_for_demo do
puts "This is a class method for #{self}"
end
end
end
Klass.new.instance_method_for_demo
Klass.class_method_for_demo
Array.class_method_for_demo
String.class_method_for_demo
到了这里我已经感觉无力解释了,只能提示一下:metaclass = (class << self; self; end)
这里面虽然有两个self,但是这两个self是不一样的……
即时还是不理解,先记住结论:在metaclass.class_eval里define_method,就可以添加类方法。
分享到:
相关推荐
Ruby元编程第二版,中文影印版,便于英文不好的同学们学习
ruby元编程.pdf ruby 元编程 这本书对ruby的调用原理做了非常精辟的分析。 ruby 元编程 这本书对ruby的元编程方式做了比较好的阐释。 ruby 元编程 这本书对结对编程有一个很好的提现。
Ruby元编程pdf
《Ruby元编程》PDF版本下载
ruby 元编程 中文 《Ruby元编程》以案例形式循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby代码库的实现细节,作者不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题的方式,更详细开...
Ruby元编程中文版
ruby元编程 第2版 中文 目录清晰 方便广大通勤族路上看,如果喜欢请购买正版纸质图书
Ruby编程,Ruby编程,Ruby编程,Ruby编程,Ruby编程,
本书的第一部分“Ruby元编程”是本书的核心部分,他讲述了一个资深程序员在办公室一周发生的事情。 本书的第二部分“Rails中的元编程”是一个元编程实例,Rail是Ruby标志性框架。 在阅读本书之前,需要了解本书的三...
《Ruby元编程》以案例形式循序渐进地介绍了Ruby特有的实用编程技巧 元编程 通过分析案例 讲解例题 回顾Ruby代码库的实现细节 《Ruby元编程》作者Paolo Perrotta不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题...
Ruby元编程 书籍配套源代码 Metaprogramming Ruby source code
2. 动态性:Ruby是一门动态性极强的编程语言,允许开发人员在运行时通过元编程(metaprogramming)来修改和扩展代码的行为。这种动态性使得Ruby具有很大的灵活性,可以应对各种需求和场景。 3. 面向对象编程:Ruby...
Metaprogramming Ruby 2nd Edition ruby元编程
元编程:编写可以编写代码的代码,ruby和rails的技术核心
基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言
《Ruby元编程》以案例形式循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby代码库的实现细节,作者不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题的方式,更详细开列出发挥其优势的...
Ruby 元编程,不错的书,就是有点难懂
Ruby 元编程 中文 高清扫描版, 完整中文版
在对Ruby进行了简要的综述之后,本书详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。 本书还包含对Ruby平台上...