介绍一下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如何调用MYSQL存储过程
May 30 面试题
char型变量中能不能存贮一个中文汉字
Jul 08 面试题
C有"按引用传递"吗
Sep 06 面试题
浙大网新C/C++面试解惑
May 27 面试题
求∏的近似值,直到最后一项的绝对值小于指定的数
Feb 12 面试题
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
Nov 09 面试题
"引用"与指针的区别是什么
Sep 07 面试题
什么是Web Service?
Jul 25 面试题
万户网络JAVA程序员岗位招聘笔试试卷
Jan 08 面试题
Java语言程序设计测试题改错题部分
Jul 22 面试题
Servlet的生命周期
Aug 25 面试题
如何理解transaction事务的概念
May 27 面试题
解释一下ruby中的特殊方法与特殊类
Feb 26 #面试题
介绍一下Ruby的多线程处理
Feb 01 #面试题
Ruby如何创建一个线程
Mar 10 #面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
You might like
世界收音机发展史
2021/03/01 无线电
php中数据的批量导入(csv文件)
2006/10/09 PHP
PHP 和 HTML
2006/10/09 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
多个应用共存的Django配置方法
2018/05/30 Python
使用tensorflow实现线性回归
2018/09/08 Python
python 重命名轴索引的方法
2018/11/10 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
了解一下python内建模块collections
2020/09/07 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
办理生育手续介绍信
2014/01/14 职场文书
win10搭建配置ftp服务器的方法
2022/08/05 Servers