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

面试题 相关文章推荐
AOP的定义以及作用
Sep 08 面试题
JDK安装目录下有哪些内容
Aug 25 面试题
Java多态性的定义以及类型
Sep 16 面试题
广州御银科技股份有限公司试卷(C++)
Nov 04 面试题
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
Feb 09 面试题
.NET初级开发工程师面试题
Apr 18 面试题
.NET常见笔试题集
Dec 01 面试题
什么是反射
Mar 17 面试题
C#软件工程师英语面试题
Jun 07 面试题
C#中有没有运算符重载?能否使用指针?
May 05 面试题
linux面试题参考答案(8)
Aug 11 面试题
ajax是什么及其工作原理
Feb 08 面试题
解释一下ruby中的特殊方法与特殊类
Feb 26 #面试题
介绍一下Ruby的多线程处理
Feb 01 #面试题
Ruby如何创建一个线程
Mar 10 #面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
You might like
NOT NULL 和NULL
2007/01/15 PHP
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
php处理json时中文问题的解决方法
2011/04/12 PHP
PHP异常处理Exception类
2015/12/11 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
Python中列表与元组的乘法操作示例
2018/02/10 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
Why do we need Unit test
2013/01/03 面试题
日语专业个人求职信范文
2014/02/02 职场文书
委托书样本
2014/04/02 职场文书
综治维稳工作汇报
2014/10/27 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
学习保证书100字
2015/02/26 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Log4j.properties配置及其使用
2021/08/02 Java/Android