Posts ruby hash fetch方法效率问题
Post
Cancel

ruby hash fetch方法效率问题

我们经常用的hash取值的问题,假设有个hash, h = {:a=>1,:b=2},对h取值,一般用索引[]的方法,比如h[:a],h[:b],在key存在的时候没有问题,但是当key不存在的时候,比如h[:x],取出来的值就是nil了,在python中甚至会直接报错,这有个问题就是,假设有个存在key的值,假设h[:c]=nil,那么按照这种规则,我根本不知道:c这个key到底是不是存在的,必须还得取h.key?(:c)判断一下。所以这里有两方面的问题,当然我们可以通过设置默认值的方式,但是ruby还有更简单的方式就是用fetch方法 h.fetch(:a),h.fetch(:b)可以实现[]一样的效果,而且还可以设置第2个参数为key不存在时的默认值,h.fetch(:x,100),假设:x不存在时,取出来的值被设置为100,这个方法省去了我们很多的判断和设置,非常方便,但是同样有隐藏的问题。

def init
  ### some code takes 10mins
end

h = {}

h.fetch(:x, init)

这里每次用fetch取值的时候,init方法都会被运行,也就是不管:x是不是存在的,都会花10mins的时间去运行init这个方法,这就意味着效率及其的低下了,如果取值频繁,这样会隐形的造成效率的大幅降低而自己却不知道怎么回事

怎么改呢?很简单,把第二个参数换成block就行了h.fetch(:x, init) => h.fetch(:x){init},(:x,init)(:x){init}的区别就在于block只有在符合条件的情况下才会被执行,也就是键:x不存在的情况下才会被执行init方法,这样效率就提高了,init并不会每次都需要去执行。ruby中的block真的是大有文章,以后再慢慢道来了,反正现在养成习惯了,hash的fetch方法后接block就对了

OLDER POSTS NEWER POSTS

Comments powered by Disqus.

Contents

Search Results