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

面试题 相关文章推荐
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
Aug 04 面试题
.net面试题
Dec 22 面试题
南京软件公司的.net程序员笔试题
Aug 31 面试题
关于VPN
Jun 10 面试题
介绍一下grep命令的使用
Jun 12 面试题
Windows和Linux动态库应用异同
Jul 28 面试题
Linux机考试题
Oct 16 面试题
软件测试工程师结构化面试题库
Nov 23 面试题
Ajax和javascript的区别
Jul 20 面试题
主要的Ajax框架都有什么
Nov 14 面试题
UNIX文件系统分类
Nov 11 面试题
如何执行一个shell程序
Nov 23 面试题
解释一下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在特殊字符前加斜杠的实现代码
2011/07/17 PHP
PHP session会话的安全性分析
2011/09/08 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
前端性能优化及技巧
2016/05/06 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
查看python下OpenCV版本的方法
2018/08/03 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
python实现简单图片物体标注工具
2019/03/18 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
python join方法使用详解
2019/07/30 Python
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
项目开发计划书
2014/01/09 职场文书
网站创业计划书
2014/04/30 职场文书
财务管理专业求职信
2014/06/11 职场文书
2016年寒假家长评语
2015/10/10 职场文书