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

面试题 相关文章推荐
你常见到的runtime exception
Sep 05 面试题
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
Jun 11 面试题
几个数据库方面的面试题
Jul 01 面试题
介绍一下SQL中union,intersect和minus
Apr 05 面试题
Linux机考试题
Jul 17 面试题
说一下Linux下有关用户和组管理的命令
Jan 04 面试题
如何整合JQuery和Prototype
Jan 31 面试题
Python面试题:如何用Python来发送邮件
Mar 15 面试题
构造方法和其他方法的区别
Apr 26 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
Nov 27 面试题
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
Apr 23 面试题
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
Mar 16 面试题
解释一下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判断并删除空目录及空子目录的方法
2015/02/11 PHP
php数组键名技巧小结
2015/02/17 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
php读取本地json文件的实例
2018/03/07 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
node.js中watch机制详解
2014/11/17 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
python版大富翁源代码分享
2018/11/19 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Django 自定义分页器的实现代码
2019/11/24 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
初婚未育证明
2014/01/15 职场文书
学校十一活动方案
2014/02/01 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL