首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

Ruby封装
EN

Stack Overflow用户
提问于 2013-03-31 03:05:46
回答 4查看 4.2K关注 0票数 1

我正在写一本名为"Beginning Ruby“的书,在我谈到封装之前,一切都很顺利。我知道这段代码在做什么,我只是不知道为什么它是用方法这样设置的。

对于那些对this is the link感兴趣的人,请参阅书中关于封装的页面。

代码语言:javascript
运行
复制
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

在我看来,像这样的东西也可以达到同样的效果:

代码语言:javascript
运行
复制
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

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

EN

回答 4

Stack Overflow用户

发布于 2013-03-31 03:08:11

Setter方法对于修改已经存在的对象的状态很有用。在你的例子中,人的名字是“某种”不可变的。您不能更改人员的姓名,您只能使用新名称创建新人员。

票数 1
EN

Stack Overflow用户

发布于 2013-03-31 03:09:58

你可以在这里找到类似的解释-- Classes in Ruby Using Getters and Setters

代码语言:javascript
运行
复制
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。

输出:

代码语言:javascript
运行
复制
"2.0.0"
"Fred Bloggs"
"Fred roy"
票数 1
EN

Stack Overflow用户

发布于 2013-03-31 03:16:52

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

我假设它们将引入attr_accessorattr_readerattr_writer,它们就像是为实例变量动态创建访问器的宏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15722331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档