下午一直都在看布置的两个题,搜了好多东西,有关那两个题的东西不太多,讲的东西也都比较简单。大多都是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