`

靠……靠谱量又足啊

    博客分类:
  • Ruby
阅读更多
起源:慎用类变量 - 实例变量靠谱量又足

  

大概如下的代码,查了我一晚上 + 一早上:

irb(main):002:0> User.class_inheritable_hash :genders
=> [:genders]
irb(main):003:0> User.genders
=> nil
irb(main):004:0> User.genders = {:a=>1}
=> {:a=>1}
irb(main):005:0> User.genders = {:b=>1}
=> {:b=>1}
我以为User.genders的结果是{:b=>1},但是:

irb(main):006:0> User.genders
=> {:a=>1, :b=>1}

翻了源码才知道:

  def class_inheritable_hash(*syms)
    class_inheritable_reader(*syms)
    class_inheritable_hash_writer(*syms)
  end

  def class_inheritable_hash_writer(*syms)
    options = syms.extract_options!
    syms.each do |sym|
      class_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def self.#{sym}=(obj)                          # def self.nicknames=(obj)
          write_inheritable_hash(:#{sym}, obj)         #   write_inheritable_hash(:nicknames, obj)
        end                                            # end
                                                       #
        #{"                                            #
        def #{sym}=(obj)                               # def nicknames=(obj)
          self.class.#{sym} = obj                      #   self.class.nicknames = obj
        end                                            # end
        " unless options[:instance_writer] == false }  # # the writer above is generated unless options[:instance_writer] == false
      EOS
    end
  end

  def write_inheritable_hash(key, hash)
    write_inheritable_attribute(key, {}) if read_inheritable_attribute(key).nil?
    write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
  end

分享到:
评论
3 楼 lijun87 2011-05-16  
终于又发现你的身影拉,嘿嘿
2 楼 yuan 2011-05-15  
chloerei 写道
"When you set a class_inheritable_array or a class_inheritable_hash you are actually concatenating (or merging) with the value inherited from the super class."

http://apidock.com/rails/Class/class_inheritable_hash

= = apidock不就这么写的么

文档上说的是super class
我没想到它是这样实现的。
1 楼 chloerei 2011-05-15  
"When you set a class_inheritable_array or a class_inheritable_hash you are actually concatenating (or merging) with the value inherited from the super class."

http://apidock.com/rails/Class/class_inheritable_hash

= = apidock不就这么写的么

相关推荐

Global site tag (gtag.js) - Google Analytics