`
darkbaby123
  • 浏览: 104237 次
  • 性别: 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 方法、类

    类是Ruby中的蓝图,用于创建具有相似属性和行为的对象。类定义使用`class`关键字开始,然后是类名,最后由`end`结束。类名通常以大写字母开头,遵循Ruby的命名规范。下面是一个简单的`Person`类的例子: ```ruby ...

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

    标题提到的“Ruby-Functo”就是Ruby中实现可组合方法对象的一个库,它为开发者提供了更灵活和模块化的代码组织方式。 Functo库的设计理念是让函数或方法像对象一样可以被操作、组合和复用。在传统的面向对象编程中...

    ruby中英文api

    在Ruby中,API主要体现在类、方法、模块和库的形式上,它们提供了丰富的功能供开发者使用。Ruby的官方API文档详细记录了每种内置类型、类、模块、方法以及它们的使用方式。"ruby中英文api"资料集可能包含了对这些...

    ruby 中文文档 必备资料

    在Ruby中,异常类是继承自`StandardError`的,你可以自定义异常类来处理特定类型的错误。 Ruby on Rails是Ruby最著名的Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。这份文档可能也涵盖了Rails的相关内容...

    ruby中文教程,从基础到深入的让你学习ruby

    在学习Ruby的过程中,你还需要了解一些工具,如Ruby的解释器irb(交互式Ruby环境)和ri/rdoc(Ruby文档工具),它们有助于调试和理解代码。版本管理工具如RVM(Ruby Version Manager)和rbenv可以帮助你管理多个Ruby...

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

    7. **缩写和全名之间的转换**:`abbreviate`和`expand_abbreviation`方法用于处理缩写和全名之间的转换,这对于处理地址或者机构名称很有帮助。 8. **数字和货币格式化**:Stringex还提供了`number_to_delimited`和...

    ruby中文文档中心资料

    在Ruby中,Web开发最知名的框架是Ruby on Rails,它遵循MVC(模型-视图-控制器)架构模式,简化了Web应用的开发。Rails提供了许多约定优于配置的特性,使得开发者可以更快速地构建功能丰富的网站。 总结起来,"ruby...

    ruby中文手册 chm

    这部分通常是对Ruby内置类库、方法、语法的详细参考,涵盖了标准库的所有模块和类,比如Array、Hash、String等。它提供了每个方法的用法、参数和返回值,是开发者在编写代码时查找特定功能或方法的重要资源。 3. *...

    笨方法学习 Ruby 电子书

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

    ruby2ruby.zip

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

    ruby中文文档.chm

    这种特性使得Ruby在处理复杂问题时具有很高的灵活性。文档中将详细讲解Ruby的基础语法,如变量声明、控制结构(条件语句、循环)、函数和方法定义等。 Ruby的面向对象特性体现在类和对象的概念上。通过定义类,你...

    ruby语言帮助文档(简体中文)

    这得益于Ruby的反射API和`send`方法,可以动态地调用方法、添加和删除方法、修改类的结构等。 7. **标准库和Gem**:Ruby的标准库提供了大量的内置模块和类,覆盖了网络、文件系统操作、日期时间处理等常见任务。...

    Ruby元编程第二版中文

    Ruby元编程是编程领域中一个深入且强大的主题,它允许程序员在运行时修改或创建代码,极大地提高了灵活性和代码的动态性。这本书“Ruby元编程第二版”专注于讲解Ruby语言的这一独特特性,旨在帮助开发者更好地理解和...

    ruby中文文档

    Ruby的设计理念是强调程序员的舒适度和代码的可读性,这使得它在编程社区中受到了广泛的欢迎。其语法简洁明了,同时提供了丰富的内置功能和库,支持多种编程范式,包括面向对象、函数式、命令式和反射。 Ruby的核心...

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

    "Finishing Moves"是一个这样的扩展,它向Ruby的核心类添加了一些实用方法,提高了代码的可读性和效率。下面我们将深入探讨这个扩展包含的一些关键知识点。 首先,`Finishing Moves`通常会增加对数组(Array)、...

    ruby中文教程(源代码)

    - 函数与方法:Ruby中的函数被称为方法,可以定义在类或模块中,支持块(block)和 Proc 对象。 2. **面向对象编程(OOP)** - 类与对象:Ruby是纯面向对象的语言,一切皆对象。你可以创建自定义类来封装数据和...

    笨方法学ruby-中文版

    书中会讲解类、对象、继承、模块(mixins)以及方法的动态性,这些都是理解Ruby编程的关键。 3. **异常处理**:Ruby中的异常处理机制允许程序在遇到错误时优雅地恢复或终止。书中会介绍如何使用begin/rescue/ensure...

    ruby中文 文档

    3. **方法**:Ruby中的方法是实现功能的代码块,可以有参数,也可以返回值。文档会介绍如何定义、调用方法,以及块(block)和 Proc 对象。 4. **异常处理**:Ruby提供了异常处理机制,通过`begin-rescue-end`块来...

    Ruby-HttpClient在Ruby中提供类似libwwwperlLWP的功能

    Ruby是一种面向对象的脚本语言,它在Web开发领域中有着广泛的应用。在处理HTTP请求时,Ruby提供了多种库来简化这一过程。其中,“HttpClient”是这样一个库,它旨在为Ruby开发者提供类似于Perl中的libwww-perl(LWP...

Global site tag (gtag.js) - Google Analytics