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

面试题 相关文章推荐
Eclipse面试题
Mar 22 面试题
金智子午JAVA面试题
Sep 04 面试题
用C或者C++语言实现SOCKET通信
Feb 24 面试题
广州迈达威.net面试题目
Mar 10 面试题
诺思信科技(南京)有限公司.NET笔试题答案
Jul 06 面试题
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
Nov 20 面试题
new修饰符是起什么作用
Jun 28 面试题
C#的几个面试问题
May 22 面试题
Linux如何压缩可执行文件
Oct 21 面试题
介绍一下JMS编程步骤
Sep 22 面试题
重写子类方法时,抛出异常的书写注意事项
Oct 17 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
May 01 面试题
解释一下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下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
利用php输出不同的心形图案
2016/04/22 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
jQuery1.6 使用方法二
2011/11/23 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
Node.js文件操作详解
2014/08/16 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
获取Django项目的全部url方法详解
2017/10/26 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
通过python爬虫赚钱的方法
2019/01/29 Python
简单了解django orm中介模型
2019/07/30 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
Python2与Python3的区别详解
2020/02/09 Python
python中spy++的使用超详细教程
2021/01/29 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
说出数据连接池的工作机制是什么?
2013/04/19 面试题
程序员岗位职责
2013/11/11 职场文书
区域销售经理岗位职责
2013/12/10 职场文书
文明教师事迹材料
2014/01/16 职场文书
电力安全事故反思
2014/04/27 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
人事主管岗位职责
2015/02/04 职场文书