浅拷贝 & define_method

by 卡布卡布 at over 8 years ago, last updated at over 8 years ago
S

下午一直都在看布置的两个题,搜了好多东西,有关那两个题的东西不太多,讲的东西也都比较简单。大多都是clone和dup的比较,都是浅拷贝,都是对拷贝的对象引用,而不是引用所指的对象。在浅拷贝的时候,先创建一个新对象,然后再拷贝内部包含的其他对象的引用。


m = ["a"]  
n = m.dup     #克隆产生一个新对象

n[0] << "b"   # n[0]和 m[0]都指向同一个对象,对其修改, n[0]和m[0]都会改变

p n   #=>["ab"]
p m   #=>["ab"]

n  << "c"   #对 n 所引用的对象进行操作

p n   #=>["ab""c"] n 增加了一个元素
p m   #=>["ab"]  m没有变化

define_method 可以帮助我们动态的,快速的定义多个方法。

先定义一个类



class Post 
    attr_accessor  :title, :content, :state  

    def initialize(title, content, state = :draft )
        @title,@content,@state = title, content, state
    end

    def  draft 
        @state = :draft
    end

    def  posted
        @state = :posted
    end

    def  deleted
        @state = :deleted
    end

end

如果用 define_method的话就可以简化一部分代码


class Post 
    attr_accessor  :title, :content, :state  

    def initialize(title, content, state = :draft )
        @title,@content,@state = title, content, state
    end

     states = [:draft, :posted, :deleted]

     states.each do |state|
        define_method state do
            @state = state
        end
     end
end