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

面试题 相关文章推荐
10条PHP编程习惯
May 26 面试题
新浪网技术部笔试题
Aug 26 面试题
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
Nov 09 面试题
统计每一学生的平均成绩
Jun 06 面试题
C/C++ 笔试、面试题目大汇总
Nov 21 面试题
应届生.NET方向面试题
May 23 面试题
如何判断计算机可能已经中马
Mar 22 面试题
在C#中如何实现多态
Jul 02 面试题
Linux的文件类型
Mar 07 面试题
AURALog面试题软件测试方面
Oct 22 面试题
UNIX文件系统常用命令
May 25 面试题
什么是servlet链?
Jul 13 面试题
解释一下ruby中的特殊方法与特殊类
Feb 26 #面试题
介绍一下Ruby的多线程处理
Feb 01 #面试题
Ruby如何创建一个线程
Mar 10 #面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
You might like
NT IIS下用ODBC连接数据库
2006/10/09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
一个完整的PHP类包含的七种语法说明
2015/06/04 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
用实例说明python的*args和**kwargs用法
2013/11/01 Python
python使用百度翻译进行中翻英示例
2014/04/14 Python
Python数据类型学习笔记
2016/01/13 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
Python分支语句与循环语句应用实例分析
2019/05/07 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
python如何删除文件、目录
2020/06/23 Python
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
几道PHP的面试题
2012/05/19 面试题
入党积极分子思想汇报
2014/01/02 职场文书
公证书样本
2014/04/10 职场文书
会计学自荐信
2014/06/03 职场文书
公司感谢信范文
2015/01/22 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
聘任书的格式及模板
2019/10/28 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android
webpack的移动端适配方案小结
2021/07/25 Javascript
各种货币符号快捷输入
2022/02/17 杂记