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

面试题 相关文章推荐
如何让Java程序执行效率更高
Jun 25 面试题
如何向接受结构参数的函数传入常数值
Feb 17 面试题
如何在存储过程中使用Loop
Jan 05 面试题
MySQL面试题
Jan 12 面试题
Linux如何为某个操作添加别名
Mar 01 面试题
介绍一下linux的文件系统
Mar 20 面试题
港湾网络笔试题
Apr 19 面试题
长青弘远的面试题
Jun 09 面试题
AssertionError 跟一下那个类是 “is – a”的关系
Feb 21 面试题
Java如何读取CLOB字段
Oct 10 面试题
程序员跳槽必看面试题总结
Jun 28 面试题
DELPHI面试题研发笔试试卷
Nov 08 面试题
解释一下ruby中的特殊方法与特殊类
Feb 26 #面试题
介绍一下Ruby的多线程处理
Feb 01 #面试题
Ruby如何创建一个线程
Mar 10 #面试题
Ruby如何进行文件操作
Jul 17 #面试题
Ruby如何实现动态方法调用
Nov 18 #面试题
介绍一下Ruby的特点
Jan 20 #面试题
JPA的优势都有哪些
Jul 04 #面试题
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
web方式ftp
2006/10/09 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
php中file_exists函数使用详解
2015/05/08 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
python版百度语音识别功能
2019/07/09 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
Python数学形态学实例分析
2019/09/06 Python
深入了解Python enumerate和zip
2020/07/16 Python
房屋转让协议书范本
2014/04/11 职场文书
高中学生期末评语
2014/04/25 职场文书
人事经理岗位职责
2014/04/28 职场文书
征兵宣传标语
2014/06/20 职场文书
七一讲话心得体会
2014/09/05 职场文书
会计专业求职信范文
2015/03/19 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python
css3应用示例:新增的选择器
2022/03/16 HTML / CSS