1、kind_of?,
is_a?,
instance_of?
的区别
obj.kind_of?
(klass) -> true or false
判断klass是否是obj的类,或者超类,或者被mixin的模块
obj.is_a?
(klass) -> true or false
和kind_of?
一样
obj.instance_of?
(klass) -> true of false
判断obj是否是由klass生成的实例
测试代码:
module Mother; end
class Father
include Mother
end
class Son < Father; end
son = Son.new
son.kind_of? Son # true
son.kind_of? Father # true
son.kind_of? Mother # true
son.is_a? Mother # true
son.instance_of? Son # true
son.instance_of? Father # false
son.instance_of? Mother # false
2、==, ===, equal?, eql? 的区别
这四个方法可以说都有细节区别,但从效果可以粗略地分为两类,一是比较两者是不是引用自同一个对象,二是比较两者的值是否相同。
obj ==
other_obj -> true or false
在Object类层面,这个方法是判断obj和 other_obj是不是同一个对象(可以理解为两者的object_id一定要相同)。但通常子类都会重写 ==
方法来加入自己的比较逻辑。虽然每个子类都对此有不同的实现,但常见的作用就是比较两个对象的值是否相同。
obj ===
other_obj -> true or false
主要用于case语句中的比较。效果和 ==
一样,但一般会被子类重写,来适应case语句的需要。很典型的就是正则表达式的 ===
方法。
obj.equal?
(other_obj) -> true or false
判断obj和other_obj的object_id是否相同。子类不会重写这个方法。所以它的效果在任何对象中都是一样的
obj.eql?
(other_obj) -> true or false
判断obj和other_obj的值是否相同。和 ==
差不多,但有些细微区别,比如Numeric类型,1.eql?(1.0) 是返回 false 的,因为两者类型不同,而 ==
则会做类型转换再比较。
测试代码:
ary1 = %w{cat dog}
ary2 = %w{cat dog}
# 测试 ==
ary1 == ary2 # true
1 == 1.0 # true
# 测试 equal?
ary1.equal? ary2 # false
1.equal? 1 # true 相同的整型数的object_id也相同,这点和Symbol类似
# 测试eql?
ary1.eql? ary2 # true
1.eql? 1 # true
1.eql? 1.0 # false 类型不同
# 测试 ===
/string/ == "string" # false
/string/ === "string" # true 为了case语句的比较而改写了Regexp的===方法
Symbol.class_eval do
# 改写Symbol的===方法,使之可以等于相同“内容”的字符串
def ===(value)
value.is_a?(String) ? self.to_s == value : super
end
end
case "string"
when :string # 这里就会调用:string === "string",成功匹配
true
else
false
end
3、Array#to_a, Array#to_ary 的区别
这里只以 Array 的对象来作比较。因为只有这个类同时实现了这两个方法。从作用而言,它们都是返回一个和原数组内容相同的数组。但细节还是有区别的。
arr.to_ary
-> ary
这个方法很简单,直接返回方法调用者。返回值和原对象没有区别。
arr.to_a
-> arr
这个方法复杂一点。首先,当arr是Array的实例时,直接返回arr;当arr是Array子类的实例时,会先使用 to_ary
获得一个数组,然后根据这个数组创建一个新数组(就是复制)返回。
测试代码:
a = [1, 2, 3]
a.to_a.equal? a # true 因为就是返回自身
a.to_ary.equal? a # true
class SubArray < Array; end
b = SubArray.new
b.to_a.equal? b # false 因为是Array的子类,所以新数组是复制过的
b.to_ary.equal? b # true
分享到:
相关推荐
Functo是ruby中的可组合方法对象
Ruby 方法、类 : Ruby 方法、类 ruby-9-method.mp4 ruby-9-method.mp4
很好的ruby学习材料,ruby的入门有点难,比较繁琐,这本书很好的帮助大家开启ruby的大门
ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby
笨方法学Ruby中文pdf。感兴趣的人可以拿来学习ruby语言。
ruby\笨方法学\笨方法学
Finishing Moves - 将一些很实用的方法添加至核心Ruby类
Stringex 一些实用的Ruby字符串扩展类
握Ruby, 找到属于自己的快乐编程方式, 做到融会贯通并灵活运用到实际工作中。 本书适合Ruby初学者学习参考, 有一定Ruby编程基础的读者若想再回顾一下Ruby的各知识点, 本书也能提供不少帮助。
也附带讲解了可运行于1.9版本的代码,事无巨细且通俗易懂地讲解了编写程序时所需要的变量、常量、方法、类、流程控制等的语法,以及主要类的使用方法和简单的应用,让没有编程经验的读者也能轻松掌握Ruby,...
本人学习总结的ruby on rails 3.1.0数据库类查询方法,比较全了
在对Ruby进行了简要的综述之后,《Ruby编程语言》详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。本书还包含对...
LearnRubyTheHardWay中文版本,笨方法学Ruby:中文网页版本,内部链接都已经调整好,下载解压可直接观看,建议采用chrome或者其它支持HTML5浏览器查看以获得最佳效果。
第一个是纯 Ruby 中模拟退火随机搜索过程的一个很好的通用实现。如果您将事物格式化为模拟退火问题,那么文件模拟退火.rb 应该在许多问题域中都很有用。第二个是针对特定问题域的模拟退火的具体实现:安排锦标赛。在...
ruby正则表达式规则 ruby中经常用到的正则表达式使用方法
第四部分:介绍一些比较高级的功能,比如Ruby的环境参数、环境变量、迭代器的用法与做法、Mix-in等。 第五部分:介绍比较复杂一点的程序范例,试着使用Ruby来写出比较实用的程序。 附录:使用Ruby时所需的知识...
Ruby是"一种用于迅速和简便的面向对象编程的解释性脚本语言";这意味着什么? 解释性脚本语言: 有直接呼叫系统调用的能力 强大的字符串操作和正则表达式 开发中快速回馈 迅速和简便: 无需变量声明 变量无...
请说明在Ruby中的字符串常用操作方法。 6. 在Ruby中如何定义函数(Method)?请简要介绍在Ruby中的函数定义和调用方式。 7. Ruby中如何处理异常(Exception Handling)?请说明在Ruby中的异常处理机制。 8. Ruby中的...
同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件。 如果直接在foo.rb中 require 'bar' 执行时会报找不到bar.rb错误。 这是因为运行 /home/oldsong$ ruby /usr/local/ruby/...
文章总结了绝大部分Ruby中处理时间和日期的方法,很实用。