如果感谢大家能看到第四篇……
为了答谢各位新老客户,所以本店将赠送大家装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 CGI 编程 Ruby 是一门通用的语言,不仅仅是一门应用于WEB开发的语言,但 Ruby 在WEB应用及WEB工具中的开发是最常见的。 使用Ruby您不仅可以编写自己的SMTP服务器,FTP程序,或Ruby Web服务器,而且还可以使用...
- 要深入了解Ruby的语法结构、面向对象编程特性以及元编程能力等核心概念。这些是编写高效、可维护代码的基础。 - 熟悉Ruby生态系统中的常用工具和库,比如Rails框架等,可以提高开发效率。 3. **培养良好的编码...
本书中的代码全部使用 Ruby 写成。Ruby 是一种简单、友好而且有趣的编程语言。因为 Ruby 清晰与灵活,我选择...如果你想学习更多内 容,推荐从 O’Reilly 的《Ruby 编程语言》(The Ruby Programming Language)一书起步
Ruby是一种纯粹的面向对象编程语言。它由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)创建于1993年。 您可以在 www.ruby-lang.org 的 Ruby 邮件列表上找到松本行弘(まつもとゆきひろ/Yukihiro Matsumoto...
Basic起步 C/C++ 脚本语言转型:Ruby, PHP, Python...
### 新手起步:Perl入门——全面解析Perl编程基础 #### 一、《Perl语言入门》:小骆驼书引领新手入门 《Perl语言入门》作为O'Reilly出版社的经典之作,被广泛誉为“小骆驼书”,是Perl编程语言学习者的首选教材。...
如果没有听说过 Rails,那么欢迎您外星旅行归来,近几年大概只有那个地方没有听说过 Ruby on Rails 了。Rails 最吸引人的地方是能够很快地建立功能完备的应用程序并运行起来。Rails 为 Ajax 而内置集成的 Prototype....
1. **Rails框架**:Ruby on Rails是一个基于Ruby编程语言的开源Web开发框架,它遵循DRY(Don't Repeat Yourself)和Convention Over Configuration的原则,提供了一套高效的开发工具和约定,简化了Web应用的构建过程...
1. **早期编程挑战**:1950年代,当编程还处于起步阶段,程序员们直接使用十六进制机器码进行编程,这一时期计算机性能低,软件规模小,因此这种方法尚可应对。 2. **结构化程序设计的兴起**:到了1960年代,随着...
- “起步”部分为Rails新手提供了入门指南,“附录”部分简要介绍了Ruby的基本语法。 - **价值与意义**: - 荣获2006年Jolt大奖“最佳技术类图书”奖项。 - 通过实际案例讲解,帮助读者快速上手Ruby on Rails...
C++和Java是典型的面向对象语言,而Python和Ruby等语言则在支持OOP的同时,提供了函数式和命令式编程等多种风格。 现代计算机语言还注重跨平台和并行处理能力。例如,JavaScript作为一种脚本语言,不仅应用于网页,...
标签“Ruby”表明这个项目主要使用Ruby编程语言,这是一种面向对象的、动态类型的、简洁明了的语言,特别适合Web开发,因其语法简洁和生产力高而受到开发者喜爱。Ruby的灵活性使得Rails框架能够实现快速开发和可读性...
Ruby是一种面向对象的、动态类型的编程语言,因其简洁和表达性强而受到开发者喜爱。在Web开发领域,Ruby常与Ruby on Rails框架结合使用,Rails提供了强大的MVC(模型-视图-控制器)架构,简化了Web应用的开发流程。...
4. **云计算**:2009年是云计算的起步阶段,Amazon Web Services(AWS)等云服务提供商开始崭露头角,杂志可能对云计算的概念、安全性、成本效益以及对企业IT架构的影响进行了深入解析。 5. **软件工程与敏捷开发**...
4. **Ruby on Rails**:Ruby 的流行框架之一,提供了许多约定优于配置的特性,使得开发过程更加高效。Rails 包含了 ORM(对象关系映射)系统如 ActiveRecord,以及大量的辅助方法和插件,用于简化常见的 Web 开发...
而后端则主要负责数据处理、业务逻辑实现以及与数据库的交互,通常由Java、Python、Ruby等服务器端语言编写,搭配数据库管理系统如MySQL或MongoDB。 这个项目适合作为Java学习的第一个练手项目,因为它涵盖了以下...
5. **开源编程语言**:2008年,Python、Perl、Ruby等开源编程语言日益流行,特别是Python,因其易学性和强大的库支持,成为科学计算和Web开发的首选语言。 6. **开源软件与企业策略**:随着开源软件的普及,越来越...
#### Grails的安装和起步 安装Grails的步骤包括: 1. 访问Grails官方网站下载最新版本或夜间构建版。 2. 解压缩下载的文件。 3. 设置GRAILS_HOME环境变量。 4. 将GRAILS_HOME/bin目录添加到系统的PATH环境变量中。 ...
`crodoc`是一个基于Crystal编程语言的文档生成工具,它的灵感来源于YARD——一个广受欢迎的Ruby文档生成库。尽管当前的`crodoc`仍处于早期阶段,仅是一个概念验证或想法,但我们可以预见到它未来可能对Crystal社区...