书接上回……
不过要先打个岔……
动态语言就是要动起来
Ruby被人说上亿遍是动态语言,所以咱就要动态给你们看
Array.class_eval do
def punch_horse_ass
puts "Piecehealth is a very tall, rich and handsome man!!!"
end
def say_truth
puts "OK, fine, acutally I'm a diaosi"
end
end
[1, 2, 3].punch_horse_ass
Array.class_eval {remove_method :say_truth}
[1, 2, 3].say_truth # undefined method `say_truth' for [1, 2, 3]:Array (NoMethodError)
上面这段代码只想表达,我们可以对一个类在任何时候为所欲为(说这个词的时候总是不自觉露出淫 荡的表情),于是,我们就要对刚才那个还非常嫩的类为所欲为了!
实现initialize方法:
这一步感觉没什么好说的,直接上代码吧
module Tool
def self.csv2class csv_name
klass_name = csv_name.gsub('.csv', '').gsub(/\s+/, '_').downcase.capitalize
klass = Object.const_set(klass_name, Class.new)
File.open(csv_name ) do |file|
attributes = file.readline.chomp.split(',')
klass.class_eval do
attr_accessor *attributes
define_method :initialize do |*args|
attributes.each_with_index do |attribute, i|
instance_variable_set("@#{attribute}", args[i])
end
end
end
end
end
end
Tool.csv2class "Friends.csv"
puts Friends.new('Lilei','M',26,'Worker').dept
相信有一定ruby基础的同学能看明白(看不明白的同学不用担心,上面的东西baidu google类似的内容很多,搜索一下吧),但是这些是经过我实践后得到的最佳解决方案。
我第一次接触这个时主要面临两个问题,我们一个一个说吧。
第一个是为什么一定要用define_method而不直接用def(像第一段代码一样),这样做除了装X还有什么好处?
好吧,为了不被雷劈,我们把define_method方法换成def,即
def initialize *args
attributes.each_with_index do |attribute, i|
instance_variable_set("@#{attribute}", args[i])
end
end
然后运行Tool.csv2class "Friends.csv"的时候报错:in `initialize': undefined local variable or method `attributes' for #<Friends:0x35b46d8> (NameError)
啊,原来class_eval相当于打开一个内环境,而attributes是内环境之外的,也就是说class_eval内外是两个不同的作用域,而且貌似没什么交集。
这就是我第二个问题,内环境外环境是如何交互的?
很显然用defing_method可以用到外面作用域的变量跟方法,而class_eval里面的实例变量,类变量赋值取值可以用instance_variable_set, instance_variable_get, class_variable_set, class_variable_get来实现,这样两套不同的体系在两个不同的作用域间各自运作,又可以相互通讯,实在是太妙了……貌似还缺一个洋气的名字,就叫扁平作用域吧!
(由于本人比较懒,写的时候随手写的,也没查阅什么资料,绝大部分都是凭借记忆,很多表达都不准确,只希望能帮大家理解元编程的一些东西)
分享到:
相关推荐
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....
- “起步”部分为Rails新手提供了入门指南,“附录”部分简要介绍了Ruby的基本语法。 - **价值与意义**: - 荣获2006年Jolt大奖“最佳技术类图书”奖项。 - 通过实际案例讲解,帮助读者快速上手Ruby on Rails...
1. **Rails框架**:Ruby on Rails是一个基于Ruby编程语言的开源Web开发框架,它遵循DRY(Don't Repeat Yourself)和Convention Over Configuration的原则,提供了一套高效的开发工具和约定,简化了Web应用的构建过程...
1. **早期编程挑战**:1950年代,当编程还处于起步阶段,程序员们直接使用十六进制机器码进行编程,这一时期计算机性能低,软件规模小,因此这种方法尚可应对。 2. **结构化程序设计的兴起**:到了1960年代,随着...
C++和Java是典型的面向对象语言,而Python和Ruby等语言则在支持OOP的同时,提供了函数式和命令式编程等多种风格。 现代计算机语言还注重跨平台和并行处理能力。例如,JavaScript作为一种脚本语言,不仅应用于网页,...
标签“Ruby”表明这个项目主要使用Ruby编程语言,这是一种面向对象的、动态类型的、简洁明了的语言,特别适合Web开发,因其语法简洁和生产力高而受到开发者喜爱。Ruby的灵活性使得Rails框架能够实现快速开发和可读性...
Ruby是一种面向对象的、动态类型的编程语言,因其简洁和表达性强而受到开发者喜爱。在Web开发领域,Ruby常与Ruby on Rails框架结合使用,Rails提供了强大的MVC(模型-视图-控制器)架构,简化了Web应用的开发流程。...
9. **编程语言新趋势**:Python、Ruby等语言的兴起,可能会引发关于编程语言选择和学习路径的讨论。 10. **职业生涯规划**:对于程序员的职业发展,如何提升技能,如何在职场中保持竞争力,以及如何平衡工作与生活...
总结来说,"omakase" 是一个基于 Ruby 的 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环境变量中。 ...
第一篇 起步篇 第1章 初识Java 3 1.1 Java简介 3 1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 Java的特点 4 1.2 安装开发工具包 5 1.2.1 下载JDK 5 1.2.2 安装JDK 6 1.2.3 安装后Java...