介绍一下Ruby中的对象,属性和方法


Posted in 面试题 onJuly 11, 2012
在Ruby中,除去内部类的对象以外,通常对象的构造都是动态确定的。某对象的性质由其内部定义的方法所决定。
看下面的例子,我们使用new方法构造一个新的对象,

class Person
def initialize(name, gender, age)
@name = name
@gender = gender
@age = age
end
end
people = Person.new(‘Tom’, ‘male’, 15)

我们可以使用Person.new方法来创建一个Person类的实例对象。以@打头的变量是实例变量,他们从属于某一实例对象,Ruby中实例变量的命名规则是变量名以@开始,您只能在方法内部使用它。
initialize方法使对象变为“就绪”状态,initialize方法是一个特殊的方法,这个方法在构造实例对象时会被自动调用。
对实例进行初始化操作时,需要重定义initialize方法。类方法new的默认的行为就是对新生成的实例执行initialize方法,传给new方法的参数会被原封不动地传给initialize方法。另外,若带块调用时,该块会被传给initialize方法。因此,不必对new方法进行重定义。
在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

输出结果为:
Tom
male
15

在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,所以我们作差值运算。

也可以重定义方法,重定义一个方法时,新的定义会覆盖原有的定义。

下面的例子重定义类中的方法meth1,
class Test
def meth1
puts “This is meth1″
end
end

a = Test.new
a.meth1

class Test
def meth1
puts “This is new meth1″
end
end

a. meth1

执行结果为:
This is meth1
This is new meth1

重定义同一个类时,意味着对原有定义进行补充,不会覆盖原来的定义。而重定义方法时,则会覆盖原有定义。

我们可以使用self标识本身,self和Java中的this有些类似,代表当前对象。
class Person
def initialize(name, gender, age)
@name = name
@gender = gender
@age = age
end

def (other)
self.age other.age
end
end

方法通常意思为比较,返回值为-1,0或1分别表示小于,等于和大于。

Tags in this post...

面试题 相关文章推荐
Sony C++笔试题
Mar 10 面试题
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
Feb 09 面试题
如何保障Web服务器安全
May 05 面试题
Linux如何修改文件和文件夹的权限
Sep 05 面试题
某公司面试题
Mar 05 面试题
软件测试面试题
Oct 21 面试题
为什么需要版本控制?
Aug 08 面试题
传统软件工程与面向对象的软件工程有什么区别
May 31 面试题
介绍一下RMI的基本概念
Dec 17 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
Oct 31 面试题
Servlet都有哪些方法?主要作用是什么?
Mar 04 面试题
Delphi CS笔试题
Jan 04 面试题
解释一下ruby中的特殊方法与特殊类
Feb 26 #面试题
介绍一下Ruby的多线程处理
Feb 01 #面试题
Ruby如何创建一个线程
Mar 10 #面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
You might like
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
jQuery总体架构的理解分析
2011/03/07 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
js实现秒表计时器
2019/12/16 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
Python中threading模块join函数用法实例分析
2015/06/04 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
python僵尸进程产生的原因
2017/07/21 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
浅谈Django的缓存机制
2018/08/23 Python
对python多线程与global变量详解
2018/11/09 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
python aiohttp的使用详解
2019/06/20 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
Python flask框架端口失效解决方案
2020/06/04 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
一名女生的自荐信
2013/12/08 职场文书
党员思想汇报材料
2014/12/19 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
考试没考好检讨书
2015/05/06 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android