微信号:rigongyizu365

介绍:一线码农不端不装的「日拱一卒」,关注技术、书籍、创业、GTD、以及一切个人成长周边的话题,每周一到五更新.

集合使用的技巧(三) | Ruby

2016-09-13 23:49 lazybios

对Hash结构使用默认哈希值

使用has_key?方法来检查Hash是否包含了某个键。不要以为访问任何一个不存在的键时都会返回nil

通过Hash#fetch方法可以更安全的处理Hash的默认值。fetch方法接受两个参数第一个为目标键,第二个参数为当该键值不存在时对应的默认值。

h = {}
h[:weekdays] 
#=> nil
h.fetch(:weekdays, 1)

对集合优先使用委托而非继承

继承并不是Ruby的最佳选择,与继承思路相反的委托,可以用来解决那些OOD分析中明显是is-a关系的建模。

委托允许你声明要代理的方法,它们会被映射到指定的实例变量所对应的方法上。它在某种程度上像是在使用继承,但有更多的控制权。使用委托你可以向外曝露若干和集合相似的接口而无需将所有接口暴露。可以看成是从外部一点点构造类的方式,这和使用继承并从中剔除不和谐部分的过程相反(继承需要用undef_method方法将不需要的方法隐藏起来或将其标记为私有)。

require 'forwardable'

class RaisingHash
  extend(Forwardable)
  include(Enumerable)

  def_delegators(@hash, :[], :[]=, :delete, :each, :keys, :values, :length, :empty?, :has_key?)

  def initialize
    @hash = Hash.new do |hash, key|
      raise KeyError, "invalid key '#{key}'!"
    end
  end
end

Forwardable不属于核心库之列,所以使用之前要引入forwardable模块,再通过def_delegators声明代理。def_delegators第一个参数即为要代理的目标对象,剩余的参数为要转发到目标对象的实例方法名称,类似于attr_accessorgettersetter方法的声明。def_delegators方法会生成对应方法名的实例方法,这些方法会直接将调用请求转发到目标对象上。

如果不想使用同名方法,可以通过def_delegator单独给某个代理方法起别名,如下,之后再调用RaisingHash#erase!方法会转发到@hash.delete

def_delegator(:@hash, :delete, :erase!)

-完-

你还可以看:

如何为Bundle Install加速

霍华德•莱文瑟的恐惧试验

编写可维护正则表达式的5个建议

参考引用


 
日拱一卒 更多文章 Objective-C中的块(block)语法初步 MPMoviePlayerController视频播放器初步 UIViewController(视图控制器)的生命周期 关于SQL中的Join Vim中的搜索与替换
猜您喜欢 京东前端:三级列表页持续架构优化 Handler 机制解析 Flask Basic Auth的实现 【Open Day】大连理工同学走入美团点评,都有哪些收获?