我正在写一本名为"Beginning Ruby“的书,在我谈到封装之前,一切都很顺利。我知道这段代码在做什么,我只是不知道为什么它是用方法这样设置的。
对于那些对this is the link感兴趣的人,请参阅书中关于封装的页面。
class Person
def initialize(name)
set_name(name)
end
def name
@first_name + ' ' + @last_name
end
def set_name(name)
first_name, last_name = name.split(/\s+/)
set_first_name(first_name)
set_last_name(last_name)
end
def set_first_name(name)
@first_name = name
end
def set_last_name(name)
@last_name = name
end
end
p = Person.new("Fred Bloggs")
puts p.name在我看来,像这样的东西也可以达到同样的效果:
class Person
def initialize(name)
@first_name, @last_name = name.split(/\s+/)
end
def name
@first_name + ' ' + @last_name
end
end
p = Person.new("Fred Bloggs")
puts p.name为什么要在单独的方法中设置对象变量呢?
发布于 2013-03-31 03:08:11
Setter方法对于修改已经存在的对象的状态很有用。在你的例子中,人的名字是“某种”不可变的。您不能更改人员的姓名,您只能使用新名称创建新人员。
发布于 2013-03-31 03:09:58
你可以在这里找到类似的解释-- Classes in Ruby Using Getters and Setters
p RUBY_VERSION
class Person
def initialize(name)
set_name(name)
end
def name
@first_name + ' ' + @last_name
end
def set_name(name)
first_name, last_name = name.split(/\s+/)
set_first_name(first_name)
set_last_name(last_name)
end
def set_first_name(name)
@first_name = name
end
def set_last_name(name)
@last_name = name
end
end
John = Person.new("Fred Bloggs")
p John.name # now suppose you misrepresented the last name at time of `John` object creation. Then what would you do?
John.set_last_name "roy" # this setter method would then help you out to update the last name.
p John.name解释:如果你在创建对象的时候设置了一个人的名字,如果你在创建时输入的信息有任何错误,你就不能改变这些信息。因为你的第二部分代码中没有setter。
输出:
"2.0.0"
"Fred Bloggs"
"Fred roy"发布于 2013-03-31 03:16:52
他们教了你很多关于实例变量的getter和setter的基础知识。假设您想用编写代码的方式更改变量,则必须直接访问实例变量。相反,它们创建了允许您访问这些变量的方法,以便您可以在类之外使用它们,而无需给予对实例变量的完全访问权限。
我假设它们将引入attr_accessor、attr_reader和attr_writer,它们就像是为实例变量动态创建访问器的宏。
https://stackoverflow.com/questions/15722331
复制相似问题