【发布时间】:2019-11-13 01:24:32
【问题描述】:
如果我想重命名下面的jedi 对象,为什么要创建一个名为rename 的实例方法,它使用setter 方法name=?为什么不直接使用setter方法`name='呢?
为什么这样做:
class Skywalker
attr_accessor :name
def initialize(name)
@name = name
end
def rename(new_name)
self.name = new_name
end
end
jedi = Skywalker.new('Anakin')
puts jedi.name
jedi.rename('Luke')
puts jedi.name
什么时候可以这样做:
class Skywalker
attr_accessor :name
def initialize(name)
@name = name
end
end
jedi = Skywalker.new('Anakin')
puts jedi.name
jedi.name = 'Luke'
puts jedi.name
上面的两个代码 sn-ps 都做同样的事情,所以我想知道除了 setter 方法 name= 之外,是否有实例方法 rename 会很有用。因为在我看来它们是多余的。
【问题讨论】:
-
您确实不需要同时使用它们。出于可读性考虑,您可能希望选择其中一个(以更好地表达您的意图)
-
请注意,您可以将
rename的定义替换为alias :rename :name=(尽管正如@Sergio 所说,两者兼有没有意义)。你是想写instance.name = ...还是instance.rename(...)纯粹是主观的。如果jedi = Skywalker.new('Anakin')、(jedi = 'Bob').upcase #=> "BOB"与jedi.rename('Bob').upcase #=> "BOB"相比可能看起来有点奇怪,但两者都能完成工作。
标签: ruby oop methods instance setter