`
reverocean
  • 浏览: 195454 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Everyday OOP Tasks in <Ruby Way>

    博客分类:
  • Ruby
阅读更多
Recently,I'm reading the <Ruby Way> book.Some people said that the book is suitable for someone who have some experience in Ruby and they must be right.Because there aren't any words to explain how to develop a ruby program and there are only some usage about Ruby hacks.

This blog is to blog some especial usage about OOP in Ruby.

Using Multiple Constructors
There is no real Multiple Constructors in Ruby(Because there is not override concept in ruby).But  the <Ruby Way> book supplies a way to implement Multiple Constructors.In fact,this way is very like a factory pattern.The following codes is a sample of Multiple Constructors.The codes show a rectangle can have two side lengths and three color values.We create additional class methods that assume certain defaults for some of the parameters.
class ColoredRectangle
  def initialize(r,g,b,s1,s2)
    @r,@g,@b,@s1,@s2 = r,g,b,s1,s2
  end
  
  def ColoredRectangle.whiteRect(s1,s2)
    new(0xff, 0xff, 0xff, s1, s2)
  end
  
  def ColoredRectangle.grayRect(s1, s2)
     new(0x88, 0x88, 0x88, s1, s2)
   end

   def ColoredRectangle.coloredSquare(r, g, b, s)
     new(r, g, b, s, s)
   end
   def ColoredRectangle.redSquare(s)
     new(0xff, 0, 0, s, s)
   end

end


More Elaborate Constructors

This is a very insteresting usage.When you create a complex class which need initialize a great number of instance variables in initialize methods,there are two method in ruby(but there is only one method in java except you implement all the setter methods of instance variables and call all the setter methods before you use the instance of this class).First,you can initialize all the instace variables in the initialize method and pass all the values in the arguments.Second,you can use the following way to initialize them.The way is to pass in a block to the initialize method.We can then evaluate the block in order to initialize the object.The following codes is a example about this:
class PersonalComputer
  attr_accessor :manufacturer,:model,:processor,:clock,
                  :ram,:disk,:monitor,:colors,:vres,:hres,:net
  def initialize(&block)
    instance_eval &block;
  end
end

desktop = PersonalComputer.new do
   self.manufacturer = "Acme"
   self.model = "THX-1138"
   self.processor = "986"
   self.clock = 2.4        # GHz
   self.ram = 1024         # Mb
   self.disk = 800         # Gb
   self.monitor = 25       # inches
   self.colors = 16777216
   self.vres = 1280
   self.hres = 1600
   self.net = "T3"
end

p desktop.inspect

If you run this code ,you will get the following result:
"#<PersonalComputer:0x2bc7580 @colors=16777216, @clock=2.4, @net=\"T3\", @monitor=25, @processor=\"986\", @hres=1600, @disk=800, @model=\"THX-1138\", @vres=1280, @ram=1024, @manufacturer=\"Acme\">"


There are several things should be noted:
First of all,we're using accessors for our attributes so that we can assign values to them in an intuitive way.Second,the reference to self is necessary because a setter always takes an explicit receiver to distinguish the method call from an ordinary assignment to a local variable.Third,we should use instance_eval instead of eval in order to evaluate the block in the context of the object rather than that of the caller.
分享到:
评论

相关推荐

    C++编程思想

    函数重载与缺省参数 69&lt;br/&gt;5.1 范围分解 69&lt;br/&gt;5.1.1 用返回值重载 70&lt;br/&gt;5.1.2 安全类型连接 70&lt;br/&gt;5.2 重载的例子 71&lt;br/&gt;5.3 缺省参数 74&lt;br/&gt;5.4 小结 81&lt;br/&gt;5.5 练习 82&lt;br/&gt;第6章 输入输出流介绍 83&lt;br/&gt;...

    c++.编程思想

    函数重载与缺省参数 69&lt;br/&gt;5.1 范围分解 69&lt;br/&gt;5.1.1 用返回值重载 70&lt;br/&gt;5.1.2 安全类型连接 70&lt;br/&gt;5.2 重载的例子 71&lt;br/&gt;5.3 缺省参数 74&lt;br/&gt;5.4 小结 81&lt;br/&gt;5.5 练习 82&lt;br/&gt;第6章 输入输出流介绍 83&lt;br/&gt;...

    北大青鸟第一学期4.0 S1所有资料一

    我已经把第一学期所有的课件打包在一起了,一共有5部分,这是第一部分&lt;br&gt;&lt;br&gt;大家载时要记得评分,这样你们就不要资源分了&lt;br&gt;&lt;br&gt;C语言&lt;br&gt;&lt;br&gt;HTML && JavaScript 电子档课件ppt.rar&lt;br&gt;&lt;br&gt;java&&OOP &lt;br&gt;&lt;br&gt;SQL...

    C++编程思想 pdf

    &lt;br/&gt;&lt;br/&gt;【目录】&lt;br/&gt;译者序&lt;br/&gt;前言&lt;br/&gt;第1章 对象的演化 1&lt;br/&gt;1.1 基本概念 1&lt;br/&gt;1.1.1 对象:特性+行为 1&lt;br/&gt;1.1.2 继承:类型关系 1&lt;br/&gt;1.1.3 多态性 2&lt;br/&gt;1.1.4 操作概念:OOP程序像什么 3&lt;br/&gt;1.2 ...

    C++面向对象特性实现机制的初步分析

    C++面向对象特性实现机制的初步分析&lt;br/&gt;&lt;br/&gt;1准备知识 &lt;br/&gt;1.1 程序对内存的使用方法&lt;br/&gt;1.2 C++ Class内存格局&lt;br/&gt;1.3 编译期和执行期&lt;br/&gt;&lt;br/&gt;2封装 &lt;br/&gt;2.1 封装的目的和意义&lt;br/&gt;2.2 封装的实现机制&lt;br/&gt;...

    设计之道 张逸

    张逸 &lt;br/&gt;目 录&lt;br/&gt;设计,看上去很美&lt;br/&gt;设计,由你掌握&lt;br/&gt;重构初体验&lt;br/&gt;从企业的运行价值链说起&lt;br/&gt;使用极限编程改善项目的设计和灵活性&lt;br/&gt;从实例谈OOP、工厂模式和重构&lt;br/&gt;从实例谈Adapter 模式&lt;br/&gt;从...

    AOP在J2EE模式实现中的应用研究

    1、&lt;br/&gt;论文标题:AOP在J2EE模式实现中的应用研究&lt;br/&gt;作者:林洪钦&lt;br/&gt;作者专业:软件工程&lt;br/&gt;导师姓名:李师贤 &lt;br/&gt;授予学位:硕士&lt;br/&gt;授予单位:中山大学 &lt;br/&gt;授予学位时间:20050425&lt;br/&gt;论文页数:1-41&lt;br/&gt;文摘...

    MCAD/MCSD Self-Paced Training Kit: Developing Windows-Based Applications with Microsoft Visual Basic .NET and Microsoft Visual C# .NET, Second Edition

    and validate user input&lt;br/&gt;•Use OOP techniques, including encapsulation and method overloading&lt;br/&gt;•Build custom controls and .NET assemblies&lt;br/&gt;•Access and modify data using XML, Microsoft ADO...

    Java数据编程指南

    附录&lt;br&gt;附录A SQL入门&lt;br&gt;什么是SQL&lt;br&gt;什么是数据库&lt;br&gt;关系数据库基础&lt;br&gt;关系数据库的优点和缺点&lt;br&gt;SQL:数据定义&lt;br&gt;基本数据操作&lt;br&gt;数据完整性&lt;br&gt;表达式&lt;br&gt;连接&lt;br&gt;合并&lt;br&gt;子查询&lt;br&gt;小结&lt;br&gt;附录B 序列...

    ACCP5.0-S2-C#OOP项目-影院售票系统

    飞悦580·制作&lt;br&gt;&lt;br&gt;解压密码:www.fy580.cn&lt;br&gt;&lt;br&gt;北大青鸟ACCP5.0二期 --- &lt;br&gt;&lt;br&gt;深入.NET平台和C#编程 ---&lt;br&gt;&lt;br&gt;项目实战 --- 《影院售票系统》&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;ShowList.xml --- XML文件&lt;br&gt;&lt;br&gt;影院...

    PHP程序设计(第2版) 英文

    第1章 PHP概述&lt;br&gt;第2章 安装配置Apache和PHP&lt;br&gt;第3章 PHP基础&lt;br&gt;第4章 函数&lt;br&gt;第5章 数组&lt;br&gt;第6章 面向对象的PHP&lt;br&gt;第7章 高级OOP特性&lt;br&gt;第8章 错误和异常处理&lt;br&gt;第9章 字符串和正则表达式&lt;br&gt;第10章 处理...

    C#入门经典.part1

    第13章 其他OOP技术 &lt;br&gt;第Ⅱ部分 Windows 编 程&lt;br&gt; 第14章 Windows编程基础&lt;br&gt; 第15章 Windows Forms的高级功能 &lt;br&gt; 第16章 使用通用对话框&lt;br&gt; 第17章 部署Windows应用程序&lt;br&gt;第Ⅲ部分 Web 编 程&lt;br&gt; 第...

    C#入门经典.part2

    第13章 其他OOP技术 &lt;br&gt;第Ⅱ部分 Windows 编 程&lt;br&gt; 第14章 Windows编程基础&lt;br&gt; 第15章 Windows Forms的高级功能 &lt;br&gt; 第16章 使用通用对话框&lt;br&gt; 第17章 部署Windows应用程序&lt;br&gt;第Ⅲ部分 Web 编 程&lt;br&gt; 第...

    设计模式解析

    &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;本书最大的特点之一是作者采用类比而不是编程实例的方式清楚地解释了概念。对于我正在开发的一套关于OOP和软件开发的音频产品,这种讲述概念的方式给予我很大的启发。&lt;br/&gt;——Bruce Eckel&lt;br/&gt;我...

    The Essential Guide to Flex 3 (Part 1)

    If you find&lt;br&gt;a different way of doing something, by all means use it if it works for you.&lt;br&gt;Second, I very purposely kept my examples simple in order to illustrate a point. I do not want&lt;br&gt;you, ...

    Visual JS

    &lt;br&gt;6. 纯OOP的控件框架方便从多个维度自定义控件;&lt;br&gt;7. 支持AJAX数据源控件;&lt;br&gt;8. 支持多语言,可以在运行过程中随意切换语言;&lt;br&gt;9. 跨浏览器,支持大多数现代浏览器 (IE6+, firefox1.5+, opera9+, safari3+);...

    PHP语言基础教程的大纲,涵盖了基础概念.docx

    Email: &lt;input type="email" name="email"&gt;&lt;br&gt; &lt;input type="submit" value="Submit"&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt; ``` 以上就是PHP语言基础教程的大纲概述及其涉及的基本知识点。通过这些知识点的学习,初学者...

    淘宝右侧悬浮导航栏

    &lt;li&gt;&lt;a href="#section1"&gt;商品&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#section2"&gt;评价&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#section3"&gt;服务&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; ``` 2. CSS3样式设计: CSS3(Cascading Style Sheets Level 3)用于...

    eo-yaml:适用于Java 8及更高版本的YAML。 用户友好的OOP库。 以前称为“骆驼”

    eo-yaml 适用于Java 8及更高版本的YAML。 基于 。 根据: YAML:trade_mark:是一种对人类友好的跨语言,基于Unicode的... &lt; version&gt;5.1.7&lt;/ version&gt; &lt;/ dependency&gt; 或下载罐。 该发行版也可以在! 用法 该库的AP

Global site tag (gtag.js) - Google Analytics