1

我正在研究“ Beginning Ruby ”一书,一切都很好,直到我开始封装。我知道这段代码在做什么,我只是不知道为什么用方法来设置它。

对于那些感兴趣的人,这是本书中封装页面的链接

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

为什么要在单独的方法中设置对象变量?

4

4 回答 4

1

假设您有一个类似于您的用户名的名称。在这种情况下,只有这两种方法的类不可用,而在原始类中,您只需执行类似的操作

Person.new("Stephan").set_last_name("de Vries")
于 2013-03-30T19:28:31.980 回答
1

Setter 方法对于修改已存在对象的状态很有用。在您的情况下,人的名字是“某种”不可变的。你不能改变人的名字,你只能用新名字创建一个新人。

于 2013-03-30T19:08:11.053 回答
1

在这里你可以找到类似的解释——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

说明:如果您在创建对象时设置了人名,如果您在创建时输入了错误信息,则无法更改。因为您的代码的第二部分中没有设置器。

输出:

"2.0.0"
"Fred Bloggs"
"Fred roy"
于 2013-03-30T19:09:58.150 回答
1

他们几乎在教你实例变量的 getter 和 setter 的基础知识。假设您想以编写代码的方式更改变量,您必须直接访问实例变量。相反,它们创建允许您访问这些变量的方法,以便您可以在类之外使用它们,而无需完全访问实例变量。

我假设它们将通向attr_accessor, attr_reader, ,attr_writer它们就像为您的实例变量动态创建访问器的宏。

于 2013-03-30T19:16:52.293 回答