2015-05-27 63 views
1

我在学习Ruby,在书中发现了这个代码示例,它是关于封装的。这: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 

我的问题是,为什么他不把属性FIRST_NAME并且在该行first_name, last_name = name.split(/\s+/)姓氏LIKE实例变量?由于在其他方面他用@符号解决了他们?

+1

不幸的是,代码示例看起来像Java getter和setter,写这个的人可能来自非Ruby背景,set_first_name和set_last_name方法应该只是使用'attr_accessor:first_name,:last_name'生成,为什么人们用这种奇怪的,非惯用的方式来编写Ruby,我不知道。 – photoionized

回答

1

这是因为类中的@表示实例变量,它们是对象实例的唯一对象。

set_name方法中,first_namelast_name是其创建方法的本地。因此作者省略了@。他不想更改其他方法中使用的实例变量。这是他正在谈论的封装。用户不能直接访问这些变量,而是让对象通过set_first_nameset_last_name方法更改它们。

回想起来,那些变量名称很差,因为已经存在一些具有相同名称的实例变量。

2

这似乎只是一个设计决定。也许他只想在一个地方设置实例变量。

如果更多步骤需要在setter中发生,或者如果他需要更改实例变量名称或其他任何东西,这可能会在稍后为他提供一些灵活性。由于本书是关于封装的,因此他可能会小心地尽可能封装这些实例变量。