文档章节

Ruby 中的Enumerable 和 Comparable 模块

穿山
 穿山
发布于 2017/11/16 22:22
字数 497
阅读 8
收藏 0
# 1 Enumerable 和 Comparable 是模块
# 2 Ruby中的集合类型基本都mixin了这两个模块
# 3 枚举模块中的lazy 处理大量数据的时候可以考虑使用lazy
# 4 符号方法 > 符号是 模块 Comparable中的
p 3 > 2
p 3.>(2)

p Comparable.instance_methods

# 5 String之类的可以比较就是因为mixin了 Comparable模块

# 6 自定义类导入Comparable 模块和 定义 <=> 方法
class Person
  attr_reader :name
  include Comparable # mixin Comparable模块
  def initialize(name)
    @name = name
  end

  # 定义<=> 通过name属性来比较 因为name属性是String类型的
  # 所以通过String的比较来比较Person
  # 这样相当于告诉Comparable 我们如何比较 我们比较的规则是什么 然后Comparable会给我们一些其他的功能
  def <=> other
    self.name <=> other.name
  end
end

p1 = Person.new('Andy')
p2 = Person.new('May')
p3 = Person.new('Young')

p p1 < p2 #true
p p1 > p3 #false
# p p2.between?(p1, p3) #true
# p p1.between?(p2, p3) #false

# 自定义类 mixin Enumerable
# 同理不单单需要include Enumerable 还要定义each方法
# 因为each 方法是Enumerable的基石 其他方法很多都是建立在each功能上完成的

class People
  attr_reader :people
  include Enumerable
  def initialize(people) # 传入Person的数据
    @people = people
  end

  # each方法是关键有了each方法 Enumerable里面的方法才能以each方法为根据
  # 使用enumerable的其他方法
  def each
    raise 'pls provide a block!' unless block_given?
    # 此处的people是实例变量 是self.people的省略写法 再加上有attr_reader :peopl 不然不能调用people
    people.each do |person| # 此处因为是自定义的类所以知道people是Array 所以可以使用each方法
        yield person
      # puts person.name
      # p person if person.name == 'Young'
      # 也可以调用的时候不写代码块 直接在方法里面写你要的代码
      # 但是这样就不Ruby了 Ruby使用代码块就是为了提高代码的复用性和灵活性
    end
  end
end

people = People.new([p1, p2, p3])
people.each do |n|
  puts n.name
end

# people.detect do |n|
#   p n if n.name == 'Young'
# end

people.detect do |n|
  n.name == 'Young'
end
# people.each
# Enumerable


 

© 著作权归作者所有

穿山
粉丝 9
博文 33
码字总数 18655
作品 0
南京
私信 提问
Ruby 模块(Mix-in)

是 Ruby的特色功能之一. 如果说类表现的是实物的实体(数据)及其行为(处理), 那么模块表现的就只是事物的行为部分. 模块与类有以下两点不同: 模块不能拥有实例 模块不能被继承 利用 Mix-in 扩...

changsanjiang
2017/10/23
0
0
Ruby的函数式编程:Part 3

在Ruby的函数式编程的第一部分,我们了解了基本的函数式编程,并且详细研究了不可变值和无副作用的代码。在第二部分,我们研究了高阶函数与柯里化(currying)的概念,同时也研究了Ruby中匿名...

jerrytao
2013/02/03
1K
0
Introducing the Aws::Record Developer Preview

Introducing the Aws::Record Developer Preview AWS Developer Blog - Ruby2016-03-0247 阅读 We are happy to announce that the gem is now in Developer Preview and available for you ......

AWS Developer Blog - Ruby
2016/03/02
0
0
Ruby 2.4.0 正式版发布

Ruby 2.4.0 正式版发布了。Ruby 是一门跨平台、面向对象的动态类型编程语言。Ruby 体现了表达的一致性和简单性,它不仅是一门编程语言,更是表达想法的一种简练方式。 此文档是除了错误修复之...

局长
2016/12/24
2.9K
7
Ruby 2.4 的一些新特性

使用了 Regexp#match? 的更快的正则表达式 Ruby 2.4 为正则表达式新增加了一个新的 #match? 方法,它比 Ruby 2.3 中Regexp的任何一个方法都要快三倍: 当你调用 Regexp#===, Regexp#=~, 或者是...

oschina
2016/07/22
3.4K
7

没有更多内容

加载失败,请刷新页面

加载更多

Kylin构建Cube过程详解

1 前言 在使用Kylin的时候,最重要的一步就是创建cube的模型定义,即指定度量和维度以及一些附加信息,然后对cube进行build,当然我们也可以根据原始表中的某一个string字段(这个字段的格式...

大数据技术进阶
刚刚
0
0
Git保存密码

保存密码 $ git config --global credential.helper store 参数 --global 设置全局,如果用 --local 则只设置当前库 要注意保存时是用明文保存的,所以不要在公用电脑使用...

编程老陆
1分钟前
0
0
ofcms 说明文档

一、模板说明 项目概述 java 版CMS系统、基于java技术研发的内容管理系统、功能:栏目模板自定义、内容模型自定义、多个站点管理、在线模板页面编辑等功能、代码完全开源、MIT授权协议。 技术...

kuchawyz
8分钟前
1
0
理解CSS相对定位和固定定位

本文转载于:专业的前端网站➦理解CSS相对定位和固定定位 前面的话   一般地,说起定位元素是指position不为static的元素,包括relative、absolute和fixed。前面已经详细介绍过absolute绝对...

前端老手
18分钟前
2
0
iOS Xcode升级包地址(感谢大神)

下载地址:DeviceSupport

_____1____
33分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部