`
darkbaby123
  • 浏览: 103312 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

比较Ruby中一些很相似的方法

阅读更多

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
分享到:
评论

相关推荐

    Ruby-Functo是ruby中的可组合方法对象

    Functo是ruby中的可组合方法对象

    Ruby 方法、类

    Ruby 方法、类 : Ruby 方法、类 ruby-9-method.mp4 ruby-9-method.mp4

    笨方法学习 Ruby 电子书

    很好的ruby学习材料,ruby的入门有点难,比较繁琐,这本书很好的帮助大家开启ruby的大门

    ruby2ruby.zip

    ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby

    笨方法学Ruby

    笨方法学Ruby中文pdf。感兴趣的人可以拿来学习ruby语言。

    笨方法学ruby.

    ruby\笨方法学\笨方法学

    Ruby-FinishingMoves将一些很实用的方法添加至核心Ruby类

    Finishing Moves - 将一些很实用的方法添加至核心Ruby类

    Ruby-Stringex一些实用的Ruby字符串扩展类

    Stringex 一些实用的Ruby字符串扩展类

    ruby基础教程(中文第四版).epub

    握Ruby, 找到属于自己的快乐编程方式, 做到融会贯通并灵活运用到实际工作中。 本书适合Ruby初学者学习参考, 有一定Ruby编程基础的读者若想再回顾一下Ruby的各知识点, 本书也能提供不少帮助。

    ruby教程中文第四版

    也附带讲解了可运行于1.9版本的代码,事无巨细且通俗易懂地讲解了编写程序时所需要的变量、常量、方法、类、流程控制等的语法,以及主要类的使用方法和简单的应用,让没有编程经验的读者也能轻松掌握Ruby,...

    ruby on rails 3.1.0数据库查询方法汇总

    本人学习总结的ruby on rails 3.1.0数据库类查询方法,比较全了

    Ruby编程语言

    在对Ruby进行了简要的综述之后,《Ruby编程语言》详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。本书还包含对...

    笨方法学ruby-中文版

    LearnRubyTheHardWay中文版本,笨方法学Ruby:中文网页版本,内部链接都已经调整好,下载解压可直接观看,建议采用chrome或者其它支持HTML5浏览器查看以获得最佳效果。

    Ruby 中模拟退火算法的实现_Ruby _代码_下载

    第一个是纯 Ruby 中模拟退火随机搜索过程的一个很好的通用实现。如果您将事物格式化为模拟退火问题,那么文件模拟退火.rb 应该在许多问题域中都很有用。第二个是针对特定问题域的模拟退火的具体实现:安排锦标赛。在...

    ruby正则表达式规则

    ruby正则表达式规则 ruby中经常用到的正则表达式使用方法

    Ruby_向ruby之父学程序设计(第二版)(经典入门)

    第四部分:介绍一些比较高级的功能,比如Ruby的环境参数、环境变量、迭代器的用法与做法、Mix-in等。  第五部分:介绍比较复杂一点的程序范例,试着使用Ruby来写出比较实用的程序。  附录:使用Ruby时所需的知识...

    ruby学习资料大全,很全很丰富

    Ruby是"一种用于迅速和简便的面向对象编程的解释性脚本语言";这意味着什么? 解释性脚本语言: 有直接呼叫系统调用的能力 强大的字符串操作和正则表达式 开发中快速回馈 迅速和简便: 无需变量声明 变量无...

    Ruby常见面试题.pdf

    请说明在Ruby中的字符串常用操作方法。 6. 在Ruby中如何定义函数(Method)?请简要介绍在Ruby中的函数定义和调用方式。 7. Ruby中如何处理异常(Exception Handling)?请说明在Ruby中的异常处理机制。 8. Ruby中的...

    举例讲解Ruby中require的使用方法

    同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件。 如果直接在foo.rb中   require 'bar' 执行时会报找不到bar.rb错误。 这是因为运行   /home/oldsong$ ruby /usr/local/ruby/...

    Ruby中处理时间和日期

    文章总结了绝大部分Ruby中处理时间和日期的方法,很实用。

Global site tag (gtag.js) - Google Analytics