开发者社区> 德哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Ruby's Enumerable Module and yield method

简介:
+关注继续查看
Hash, Array, Range, Set 类的对象为什么可以使用include?, min, max等方法, 原因是这些CLASS包含了Enumerable模块.
这个模块的详细介绍可以在Ruby Core API Reference中查询.
下面对某些方法举例说明 : 
测试版本1.9.3-p0
一、内建类型的Enumerable方法调用
1. min
a = Array.new(['z','abc','bc','d1','efg'])
p(a.min)   #=>"abc" , 默认情况下min 判断的是ascii码
p(a.min{
 |x|
 x.length
 })  #=>"z" , 这里判断的是字符长度.


2. max
a = {'z'=>'digoal',
 'abc'=>'francs',
 'bc'=>'dage',
 'd1'=>'hank',
 'efg'=>'new'}
p(a) #=>{"z"=>"digoal", "abc"=>"francs", "bc"=>"dage", "d1"=>"hank", "efg"=>"new"}
p(a.max) #=>["z", "digoal"]
p(a.max{
 |x|
 x.length
 }) #=>["efg", "new"] , 这里判断的是hash key的字符长度.


3. sort
a = {'z'=>'digoal',
 'abc'=>'francs',
 'bc'=>'dage',
 'd1'=>'hank',
 'efg'=>'new'}
p(a) #=> {"z"=>"digoal", "abc"=>"francs", "bc"=>"dage", "d1"=>"hank", "efg"=>"new"}
p(a.sort) #=> [["abc", "francs"], ["bc", "dage"], ["d1", "hank"], ["efg", "new"], ["z", "digoal"]] , 默认按ASCII排序
p(a.sort{
 |x,y|
 x[0].length <=> y[0].length
 }) #=> [["z", "digoal"], ["d1", "hank"], ["bc", "dage"], ["abc", "francs"], ["efg", "new"]]  , 这里按照Hash key的长度排序
p(a.sort{
 |x,y|
 x[1].length <=> y[1].length
 }) #=> [["efg", "new"], ["d1", "hank"], ["bc", "dage"], ["abc", "francs"], ["z", "digoal"]] , 这里按照Hash value的长度排序


4. collect
a = [1,2,3,4,5,6]
b = a.collect {
 |x|
 x * x
}
p(a) #=> [1, 2, 3, 4, 5, 6]
p(b) #=> [1, 4, 9, 16, 25, 36] , collect方法重新构造一组数据.


5. include?
a = [1,2,3,4,5,6]
p(a.include?(1)) #=> true , 判断是否包含1
p(a.include?(7)) #=> false , 判断是否包含7


二、自定义CLASS中包含Enumerable模块举例 : 
class MyClass
 include Enumerable # 这个指包含Enumerable模块
 def initialize( someItems )
  @items = someItems
 end

 def each # 要在自定义类中使用Enumerable模块中的方法, 必须写一个each 方法, 告诉其他要调用的Enumerable方法每次传什么值进去.
  @items.each{
                       |i|
   yield(i)  # yield方法里面的参数, 就是表示其他要调用的Enumerable方法每次传什么值进去.这里每次传的就是i
  }
 end
end

a = MyClass.new(['c','bda1a','baz','ce','zwfg'])
p(a) #=> #<MyClass:0x1ef0db0 @items=["c", "bda1a", "baz", "ce", "zwfg"]>
p(a.sort) #=> ["baz", "bda1a", "c", "ce", "zwfg"]

class MyClass
 include Enumerable
 def initialize( someItems )
  @items = someItems
 end

 def each
  @items.each{
   |i|
   yield(i.to_s.length) #这里每次传的是i.to_s.length
  }
 end
end

a = MyClass.new(['c','bda1a','baz','ce','zwfg'])
p(a) # => #<MyClass:0x1e90c90 @items=["c", "bda1a", "baz", "ce", "zwfg"]>
p(a.sort) # => [1, 2, 3, 4, 5]

# 自定义类型中如果没有定义each方法, 但是调用了Enumerable中的方法会报错, 例如 : 
`sort': undefined method `each' for #<MyClass:0x1ebfb08 @items=["c", "bda1a", "baz", "ce", "zwfg"]> (NoMethodError)

【参考】
Ruby Core API Reference : Enumerable
The Book of Ruby : Page 100 - 105

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
RocketMQ-事务消息(分布式事务)
本文将阐述分布式事务的实现方式。
99 0
Apache RocketMQ 4.9.1 高性能优化之路(上)
Apache RocketMQ 4.9.1 高性能优化之路(上)
61 0
MODULE_DEVICE_TABLE【转】
转自:http://blog.csdn.net/tangkegagalikaiwu/article/details/8444249 This pci_device_id structure needs to be exported to user space to allow the hotplu...
766 0
+关注
德哥
公益是一辈子的事, I&#39;m digoal, just do it.
2153
文章
245
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载