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

面试题 相关文章推荐
接口中的方法可以是abstract的吗
Jul 23 面试题
华为的Java面试题
Mar 07 面试题
Oracle快照(snapshot)
Mar 13 面试题
杭州-飞时达软件有限公司.net笔面试
Apr 28 面试题
什么是Linux虚拟文件系统VFS
Jan 31 面试题
介绍一下linux的文件系统
Oct 06 面试题
一套软件开发工程师笔试题
May 18 面试题
广州某公司软件工程师面试题
Dec 22 面试题
如何开发一个JQuery插件
Jul 28 面试题
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
May 20 面试题
Java基础面试题
Jul 19 面试题
JPA的优势都有哪些
Jul 04 面试题
解释一下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中文件上传的一个问题
2010/09/04 PHP
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
Python中asyncore的用法实例
2014/09/29 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
django中related_name的用法说明
2020/05/20 Python
Pycharm调试程序技巧小结
2020/08/08 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
方正Java笔试题
2014/07/03 面试题
销售总监工作职责
2013/11/21 职场文书
安全生产责任书范本
2014/04/15 职场文书
导师工作推荐信范文
2014/05/17 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
工程服务质量承诺书
2015/04/29 职场文书
在校生证明
2015/06/17 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js