介绍一下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...

面试题 相关文章推荐
PHP经典面试题
Sep 03 面试题
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
May 24 面试题
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
Apr 03 面试题
关于Assembly命名空间的三个面试题
Jul 23 面试题
如何转换一个字符串到enum值
Apr 12 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
Jun 16 面试题
网络安全方面的面试题
Jan 07 面试题
linux面试题参考答案(1)
Jan 22 面试题
网上常见的一份Linux面试题(多项选择部分)
Feb 07 面试题
linux比较文件内容的命令是什么
Mar 04 面试题
介绍一下Python下range()函数的用法
Nov 07 面试题
一套英文Java笔试题面试题
Apr 21 面试题
解释一下ruby中的特殊方法与特殊类
Feb 26 #面试题
介绍一下Ruby的多线程处理
Feb 01 #面试题
Ruby如何创建一个线程
Mar 10 #面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
You might like
php 文件上传系统手记
2009/10/26 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
python实现人脸识别代码
2017/11/08 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
介绍一下gcc特性
2012/01/20 面试题
一套软件测试笔试题
2014/07/25 面试题
教师评优的个人自我评价分享
2013/09/19 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
房产公证书范本
2014/04/10 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
司法所长先进事迹
2014/06/02 职场文书
暂住证证明
2015/06/19 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL