Ruby 中的对象变量
Object Variables in 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和last_name像实例变量放在这一行first_name, last_name = name.split(/\s+/)
?因为在其他行中他用@符号解决了它们?
这是因为类中的@
表示对象实例独有的实例变量。
在 set_name
方法中,first_name
和 last_name
对于创建它们的方法是局部的。因此作者省略了@
。他不想更改其他方法中使用的实例变量。这就是他说的封装。用户不能直接访问这些变量,而是让对象通过 set_first_name
和 set_last_name
方法更改它们。
回想起来,这些变量名很糟糕,因为已经存在一些同名的实例变量。
这似乎只是一个设计决定。也许他只想在一个地方设置实例变量。
如果以后需要在 setter 中执行更多步骤,或者如果他真的需要更改实例变量名称或其他任何东西,这可以让他在以后有一些灵活性。
既然这本书是讲封装的,他可能是在小心翼翼地尽可能封装那些实例变量。
我正在学习 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和last_name像实例变量放在这一行first_name, last_name = name.split(/\s+/)
?因为在其他行中他用@符号解决了它们?
这是因为类中的@
表示对象实例独有的实例变量。
在 set_name
方法中,first_name
和 last_name
对于创建它们的方法是局部的。因此作者省略了@
。他不想更改其他方法中使用的实例变量。这就是他说的封装。用户不能直接访问这些变量,而是让对象通过 set_first_name
和 set_last_name
方法更改它们。
回想起来,这些变量名很糟糕,因为已经存在一些同名的实例变量。
这似乎只是一个设计决定。也许他只想在一个地方设置实例变量。
如果以后需要在 setter 中执行更多步骤,或者如果他真的需要更改实例变量名称或其他任何东西,这可以让他在以后有一些灵活性。
既然这本书是讲封装的,他可能是在小心翼翼地尽可能封装那些实例变量。