- 浏览: 442091 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (470)
- 前言 (1)
- 【sys】centos6.2 (51)
- 【sys】shell (8)
- 【sys】yum (1)
- software (6)
- 【tec】ruby (16)
- 【tec】rails (35)
- 【tec】rails路由 (2)
- 【tec】rails部署 (10)
- 【tec】rails优化 (6)
- 【tec】rails测试 (11)
- 【tec】php (45)
- 【tec】android (1)
- 【tec】ios (125)
- 【data】mysql (11)
- web (6)
- 【life】文学与提升 (2)
- life (36)
- 【life】怀念 (1)
- 【web】nginx (5)
- 【web】网络与安全 (4)
- 工作随笔 (1)
- 【software】svn (5)
- 【script】jquery (10)
- powerEdge (2)
- 杂七杂八 (5)
- 【sys】ubuntu (9)
- 【sys】windows (4)
- 【tec】java (1)
- 【tec】html (3)
- 【tec】c++ (38)
- 【tec】汇编 (1)
- 【data】数据库 (1)
- 【exchange 】学术交流 (1)
- 【tec】域名空间 (1)
- 【tec】编程先知 (1)
- 【tec】网站建设 (7)
- 【sys】mac (24)
- 【sys】seo (1)
- 【tec】wp (1)
- 【software】git (4)
最新评论
-
fireDragonpzy:
呵呵 貌似我网站上的有更新 你从那里看看 这个博客维护的不及时 ...
牛人经典语录 -
Peppermintchz:
还真这么2过啊!!好怀念啊
牛人经典语录 -
fireDragonpzy:
chenhong53 写道你好,我想问一下,能不能给一组精灵数 ...
cocos2d-x事件触发的优先级 -
chenhong53:
你好,我想问一下,能不能给一组精灵数组中的精灵添加触屏优先级, ...
cocos2d-x事件触发的优先级 -
fireDragonpzy:
dreamstar1020 写道谢谢庞兄指点,写的很详细,谢谢 ...
致:上海郑兄(虚拟主机-web服务器搭建)
1、定义
若某个类被定义过,此时又用相同的类名进行定义,意味着对原有的类进行追加(重定义同一个类时,意味着对原有定义进行补充,不会覆盖原来的定义。而重定义方法时,则会覆盖原有定义。
)
2、变量
在ruby中,只有方法可以操作实例变量,因此可以说Ruby中的封装是强制性的。在对象外部不可以直接访问,只能通过接口方法访问。
在Ruby中,一个对象的内部属性都是私有的。上面的代码中,我们定义了方法name,gender,age三个方法用来访问Person类实例对象的实例变量。注意name,gender,age访问只能读取相应实例变量,而不能改变它们的值。
我们也可以用成员变量只读控制符attr_reader来达到同样的效果。
类似地,我们可以定义方法去改变成员变量的值。
也可以用成员变量写控制符attr_writer来达到同样的效果。
我们也可以使用attr_accessor来说明成员变量既可以读,也可以写。
也可以使用attr控制符来控制变量是否可读写。attr 只能带一个符号参数, 第二个参数是一个 bool参数,用于指示是否为符号参数产生写方法。它的默认值是 false,只产生读方法,不产生写方法。
注意attr_reader,attr_writer,attr_accessor和attr不是语言的关键字,而是Module模块的方法。
上面代码中, 我们使用Test.instance_methods 得到Test 类所有的实例方法, 使用Test.superclass.public_methods得到Test父类所有的实例方法,然后相减就得到Test类不包含父类的所有的实例方法。
由于instance_methods方法返回值为一个Array,所以我们作差值运算
3、特殊方法与特殊类
特殊方法是指某实例所特有的方法。一个对象有哪些行为由对向所属的类决定,但是有时候,一些特殊的对象有和其他对象不一样的行为,在多数程序设计语言中,例如C++和Java,我们必须定义一个新类,但在Ruby中,我们可以定义只从属于某个特定对象的方法,这种方法我们成为特殊方法(Singleton Method)。
有时候,我们需要给一个对象定义一系列的特殊方法,如果按照前面的方法,那么只能一个一个定义:
这样做非常繁复麻烦,而且无法给出一个统一的概念模型,因此Ruby提供了另外一种方法,
obj是一个具体的对象实例,class << 代表它的特殊类。
4、类变量与类方法
1)类变量在使用前必须初始化,类变量在使用前必须初始化;类变量是私有的,在类外无法直接访问,你只能通过实例方法和类方法去访问它。
同样,类方法是属于一个类的方法,定义类方法时需要在方法前加上类名
2)Ruby和C++/Java的一个显著不同是存取控制是程序运行时决定的而不是静态绑定的。所以只有在访问一个受限制的方法时才会产生运行时错误。
3)方法的存取控制有三种:
公有方法(Public Method)
方法在任何地方都可以被调用,这是方法的默认存取控制。除了initialize和initialize_cpoy方法,他们永远是私有方法。
保护方法(Protected Method)
方法只能被定义这个方法的类自己的对象和这个类的子类的对象所访问。
私有方法(private Method)
方法只能被定义这个方法的类的对象自己访问,即使是这个类的其他对象也不能访问。
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的概念有所区别,保护方法的意思是方法只能方法只能被定义这个方法的类自己的对象和子类的对象访问,私有方法只能被对象自己访问。
也可以使用以下更简单的形式:
Ruby和C++/Java的一个显著不同是存取控制是程序运行时决定的而不是静态绑定的。所以只有在访问一个受限制的方法时才会产生运行时错误。
5、元类
在Ruby中一切都是对象。类和实例对象都是对象。这句话听起来有点拗口,让我们来看一个例子:
没错,类也是对象,这是Ruby和C++/Java的一个显著不同,在C++/Java中,类仅仅是一个数据抽象,并没有类也是对象这样的概念。而在Ruby中存在着元类的概念,类也是对象,所有类都是元类的实例对象。和C++/Java相比,Ruby的面向对象程度更高。
可以看到,类对象和实例对象一样有自己的ojbect_id,你可以象调用一个实例对象的方法一样去用它去调用类方法。所有类对象的类是Class类,Oject类是所有类的基类。
这样,我们可以从另一个角度去理解类变量与类方法,类变量就是一个类对象的实例变量,类方法就是指一个类对象类的特殊方法。
类方法具体可分为两种:第一种是在所有的类的父类Class中定义的,且被所有的类所共享的方法;第二种是各个类所特有的特殊方法。
类方法中的self指的是类本身,这点需要牢记,这样我们可以使用多种方式定义类方法。
6、Ruby 的动态性
若某个类被定义过,此时又用相同的类名进行定义,意味着对原有的类进行追加(重定义同一个类时,意味着对原有定义进行补充,不会覆盖原来的定义。而重定义方法时,则会覆盖原有定义。
)
2、变量
在ruby中,只有方法可以操作实例变量,因此可以说Ruby中的封装是强制性的。在对象外部不可以直接访问,只能通过接口方法访问。
class Person def name @name end def gender @gender end def age @age end end people = Person.new('Tom', 'male', 15) puts people.name puts people.gender puts people.age
在Ruby中,一个对象的内部属性都是私有的。上面的代码中,我们定义了方法name,gender,age三个方法用来访问Person类实例对象的实例变量。注意name,gender,age访问只能读取相应实例变量,而不能改变它们的值。
我们也可以用成员变量只读控制符attr_reader来达到同样的效果。
class Person attr_reader :name, :gender, :age end
类似地,我们可以定义方法去改变成员变量的值。
class Person def name=(name) @name=name end def gender=(gender) @gender=gender end def age=(age) @age=age end end people = Person.new('Tom', 'male', 15) people.name = "Henry" people.gender = "male" people.age = 25
也可以用成员变量写控制符attr_writer来达到同样的效果。
class Person attr_writer :name, :gender, :age end
我们也可以使用attr_accessor来说明成员变量既可以读,也可以写。
class Person attr_accessor :name, :gender, :age end
也可以使用attr控制符来控制变量是否可读写。attr 只能带一个符号参数, 第二个参数是一个 bool参数,用于指示是否为符号参数产生写方法。它的默认值是 false,只产生读方法,不产生写方法。
class Person attr :name, true #读写 attr :gender, true #读写 attr :age, true #读写 attr :id, false #只读 end
注意attr_reader,attr_writer,attr_accessor和attr不是语言的关键字,而是Module模块的方法。
class Test attr_accessor :value end puts Test.instance_methods - Test.superclass.public_methods #执行结果为: value value=
上面代码中, 我们使用Test.instance_methods 得到Test 类所有的实例方法, 使用Test.superclass.public_methods得到Test父类所有的实例方法,然后相减就得到Test类不包含父类的所有的实例方法。
由于instance_methods方法返回值为一个Array,所以我们作差值运算
3、特殊方法与特殊类
特殊方法是指某实例所特有的方法。一个对象有哪些行为由对向所属的类决定,但是有时候,一些特殊的对象有和其他对象不一样的行为,在多数程序设计语言中,例如C++和Java,我们必须定义一个新类,但在Ruby中,我们可以定义只从属于某个特定对象的方法,这种方法我们成为特殊方法(Singleton Method)。
class SingletonTest def info puts "This is This is SingletonTest method" end end obj1 = SingletonTest.new obj2 = SingletonTest.new def obj2.info puts "This is obj2" end obj1.info obj2.info 执行结果为: This is This is SingletonTest method This is obj2
有时候,我们需要给一个对象定义一系列的特殊方法,如果按照前面的方法,那么只能一个一个定义:
def obj2.singleton_method1 end def obj2.singleton_method2 end def obj2.singleton_method3 end …… def obj2.singleton_methodn end
这样做非常繁复麻烦,而且无法给出一个统一的概念模型,因此Ruby提供了另外一种方法,
class << obj …… end
obj是一个具体的对象实例,class << 代表它的特殊类。
class SingletonTest def meth1 puts "This is meth1" end def meth2 puts "This is meth2" end end obj1 = SingletonTest.new obj2 = SingletonTest.new class << obj2 def meth1 puts "This is obj2's meth1" end def meth2 puts "This is obj2's meth2" end end obj1.meth1 obj1.meth2 obj2.meth1 obj2.meth2 执行结果为: This is meth1 This is meth2 This is obj2's meth1 This is obj2's meth2
4、类变量与类方法
1)类变量在使用前必须初始化,类变量在使用前必须初始化;类变量是私有的,在类外无法直接访问,你只能通过实例方法和类方法去访问它。
同样,类方法是属于一个类的方法,定义类方法时需要在方法前加上类名
2)Ruby和C++/Java的一个显著不同是存取控制是程序运行时决定的而不是静态绑定的。所以只有在访问一个受限制的方法时才会产生运行时错误。
3)方法的存取控制有三种:
公有方法(Public Method)
方法在任何地方都可以被调用,这是方法的默认存取控制。除了initialize和initialize_cpoy方法,他们永远是私有方法。
保护方法(Protected Method)
方法只能被定义这个方法的类自己的对象和这个类的子类的对象所访问。
私有方法(private Method)
方法只能被定义这个方法的类的对象自己访问,即使是这个类的其他对象也不能访问。
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的概念有所区别,保护方法的意思是方法只能方法只能被定义这个方法的类自己的对象和子类的对象访问,私有方法只能被对象自己访问。
class Test def method1 #默认为公有方法 … end protected #保护方法 def method2 … end private #私有方法 def method3 end public def test_protected(arg) #arg是Test类的对象 arg.method2 #正确,可以访问同类其他对象的保护方法 end def test_private(arg) #arg是Test类的对象 arg.method3 #错误,不能访问同类其他对象的私有方法 end end obj1 = Test.new obj2 = Test.new obj1.test_protected(obj2) obj1.test_private(obj2)
也可以使用以下更简单的形式:
class Test def method1 ... end def method2 ... end def method3 ... end def methdo4 ... end public :method1 protected :method2 private :method3, :method4 end
Ruby和C++/Java的一个显著不同是存取控制是程序运行时决定的而不是静态绑定的。所以只有在访问一个受限制的方法时才会产生运行时错误。
5、元类
在Ruby中一切都是对象。类和实例对象都是对象。这句话听起来有点拗口,让我们来看一个例子:
class Person def initialize(name, gender, age) @name = name @gender = gender @age = age end end a = Person.new('Tom', 'male', 15) puts a.object_id => 22429840 puts Person.object_id => 22429960
没错,类也是对象,这是Ruby和C++/Java的一个显著不同,在C++/Java中,类仅仅是一个数据抽象,并没有类也是对象这样的概念。而在Ruby中存在着元类的概念,类也是对象,所有类都是元类的实例对象。和C++/Java相比,Ruby的面向对象程度更高。
可以看到,类对象和实例对象一样有自己的ojbect_id,你可以象调用一个实例对象的方法一样去用它去调用类方法。所有类对象的类是Class类,Oject类是所有类的基类。
irb(main):003:0> Object.class => Class irb(main):004:0> Object.superclass => BasicObject irb(main):004:0> BasicObject.superclass =>
这样,我们可以从另一个角度去理解类变量与类方法,类变量就是一个类对象的实例变量,类方法就是指一个类对象类的特殊方法。
类方法具体可分为两种:第一种是在所有的类的父类Class中定义的,且被所有的类所共享的方法;第二种是各个类所特有的特殊方法。
类方法中的self指的是类本身,这点需要牢记,这样我们可以使用多种方式定义类方法。
class Test #定义类方法方式1 def Test.meth1 # ... end #定义类方法方式2 def self.meth2 # ... end #定义类方法方式3只能放在类定义里面 class << Test def meth3 # ... end end #定义类方法方式4 class << self def meth4 # ... end end end
6、Ruby 的动态性
class UndefTest def meth puts "This is meth" end end obj1 = UndefTest.new obj1.meth class UndefTest undef_method(:meth)或者undef meth end obj1.meth 执行结果为: This is meth test.rb:14: undefined method `meth' for #<UndefTest:0x2ac8240> (NoMethodError)
发表评论
-
论 Ruby 顶层及 Object、Kernel 的关系
2012-05-14 10:44 957http://szsu.wordpress.com ... -
ruby基础
2012-04-16 11:25 661http://www.oschina.net/code/lis ... -
ruby base之字符串操作
2012-03-12 11:20 7451 字符串的截取:str[0,str.length-1] -
ruby base之文件操作
2012-02-14 14:38 856data =File.stat(__FILE__) puts ... -
ruby base之目录操作
2012-02-14 14:36 827p Dir.pwd #输出当前目录 p Dir.getw ... -
rails base 之数据库---查询
2012-02-09 12:56 599a = Category.new(:name => 'R ... -
ruby base之类型
2012-02-04 11:12 9271 Array Array也称作数组,是一系列元素的有序集合。 ... -
ruby 加密与编码
2012-02-03 10:50 835md5 require 'md5' puts MD5.h ... -
ruby和rails的安全性问题学习
2012-02-02 16:28 1353因为在论坛http://www.ruby-lang.org.c ... -
Ruby企业版(REE)调优
2012-01-10 09:48 782最近国外的一个同行Brya ... -
ruby base
2012-01-10 09:13 8151 加密 MD5加密方式: require 'md5' pu ... -
Ruby Base之 standard accumulate
2012-01-08 16:44 780一:代码块:(一些能和方法关联在一起调用的代码,它们简直就像是 ... -
Ruby Promote 之 programme accumulate
2012-01-08 16:38 7801 hash的[]方法参数尽量使用symbol 2 gem ... -
Ruby Base 之 programme accumulate
2012-01-08 16:10 801一:迭代 5.times { print "*&q ... -
Ruby Base 之代码块、迭代子和过程对象
2012-01-08 16:06 773在Ruby中一切皆对象。甚 ...
相关推荐
Ruby的面向对象的枚举
Ruby是一门简洁、灵活而又优雅的...它支持类、继承、封装等面向对象的概念,并提供了丰富的类库和模块,方便开发人员进行面向对象的编程。 4. 生态系统:Ruby拥有活跃的开源社区和丰富的生态系统,提供了大量的库和
Ruby 方法、类 : Ruby 方法、类 ruby-9-method.mp4 ruby-9-method.mp4
ruby-debug-base19-0.11.26.gem
面向对象的脚本语言Ruby
pundit, 通过面向对象设计和纯 ruby 类进行最小授权 Pundit Pundit提供了一组帮助器,它指导你利用正则 ruby 类和面向对象设计模式构建一个简单。健壮和可以扩展的。链接:API文档源代码 。行为准则。赞助: 安装gem...
MongoMapper - 针对Mongo的一个Ruby对象映射器
主要介绍了Ruby中的类对象的概念,是Ruby学习当中的基础知识,需要的朋友可以参考下
Ruby 面向对象设计实践--2013年
《Ruby程序设计语言》是Ruby的权威指南,全面涵盖该语言的1.8版和1.9版。本书详尽但并不拘泥于语言... 数据类型和对象 表达式和操作符 语句和控制结构 Method、proc、lambda和closure 类和模块 反射和元编程
Kashmir是一个Ruby DSL使得序列化和缓存对象易如反掌
Functo是ruby中的可组合方法对象
类与对象:理解Ruby中的类和对象的概念,学习如何定义类、创建对象以及使用对象的属性和方法。 继承与多态:掌握Ruby中的继承机制,了解子类如何继承父类的属性和方法,并实现自己的特定功能。同时,学习多态的...
Ruby中的每个值是一个对象,即使是最原始的东西:字符串,数字甚至true和false。即使是一个类本身是一个对象,它是Class类的一个实例。本章将通过所有功能涉及到Ruby的面向对象。 类是用来指定对象的形式,它结合了...
使用场景及目标:通过幽默风趣的语言和生动的比喻,帮助读者理解并掌握Ruby编程的基本概念、数据结构、文件操作、正则表达式等核心知识点。了解如何使用Web框架和Gem进行项目开发,为实际的编程工作做好准备。
ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码
ruby面向对象设计 英文版 高清 ruby面向对象设计 英文版 高清
Her 一个ORM(对象关系映射)将REST资源映射成Ruby对象,它旨在用一个RESTful API代替数据库来构建应用程序。
完整书名《Ruby Programming-向Ruby之父学程序设计》 ,就是那本经典的绿皮书 第一部分:通过简单的Ruby程序来介绍程序的基本架构。 第二部分:介绍基础语法规则,以及类、模块等面向对象程序设计的思考方法与...