介绍一下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的面试题
May 06 面试题
请介绍一下Ant
Jul 22 面试题
C语言怎样定义和声明全局变量和函数最好
Nov 26 面试题
请写出char *p与"零值"比较的if语句
Sep 24 面试题
存储过程的优缺点是什么
Jan 10 面试题
什么是Assembly(程序集)
Sep 14 面试题
TCP协议通讯的过程和步骤是什么
Oct 18 面试题
abstract是什么意思
Feb 12 面试题
如何开启linux的ssh服务
Jun 03 面试题
中科软笔试题和面试题
Oct 07 面试题
几个MySql的面试题
Apr 22 面试题
如何从一个文件档案的尾端新增记录
Dec 02 面试题
解释一下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简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
php并发加锁示例
2016/10/17 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python生成随机图形验证码详解
2017/11/08 Python
解决python报错MemoryError的问题
2018/06/26 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
python处理写入数据代码讲解
2020/10/22 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
动物科学专业毕业生的自我评价
2013/11/29 职场文书
运动会通讯稿50字
2014/01/30 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
捐助倡议书
2015/01/19 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
导游词之河北邯郸
2019/09/12 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB