如果我创建一个这样的类:
class Player
def initialize(position, name)
@position = position
@name = name
end
end
是不是将名称设置为实例变量?如果是这样,为什么我需要写一个这样的setter
class Player
def initialize(position, name)
@position = position
@name = name
end
def name=(name)
@name = name
end
end
基本上什么时候需要在课堂上写getter?
答案 0 :(得分:1)
initialize
在新对象的初始化期间设置属性。
keeper = Player.new('goalkeeper','Shilton').
如果您想在初始化后更新keeper
的属性,该怎么办?那么你需要使用普通的setter方法:
def name=(name)
@name = name
end
像这样:
keeper.name = 'Banks'
如果您没有为Player实例定义setter方法,则无法执行此操作。同样适用于getter方法。另请注意,您可以使用attr_accessor重构您的代码,如下所示:
class Player
attr_accessor :name, :position
def initialize(position, name)
@position = position
@name = name
end
end
答案 1 :(得分:1)
Getters和setter的工作是为您提供在构造函数中定义的实例变量的读写快速实现:
class Player
attr_accessor :name, :position
def initialize(position, name)
@position = position
@name = name
end
end
您还可以专门为这些变量使用attr_reader
(对于getter)和attr_writer
(对于setter)。
以上代码:attr_accessor :name, :position
为您提供#name
,#position
,#name=
和#position=
方法,例如Player
类。< / p>
但是,它们不会为getter / setter提供验证或定制逻辑。
例如:您可能想要显示玩家的全名,或者不希望您的代码接受0或负位置,在这种情况下,您必须自己编写getter和setter:
class Player
def initialize(first_name, last_name, position)
@first_name = first_name
@last_name = last_name
@position = position
end
# validation for updating position using setter of position
def position=(new_position)
raise "invalid position: #{new_position}" if new_position <= 0
@position = new_position
end
# customized getter for name method
def name
"#{@first_name} #{@last_name}"
end
end
如果您不需要如上所述进行自定义,那么对这些变量使用attr_*
方法更有意义。
答案 2 :(得分:0)
Getters / setter,也称为“访问者”,可以在类外部访问,实例变量则不可访问。如果您希望能够从外部类中读取或更改@name
,则可以为其定义访问器。
此外,访问器方法允许您执行一定数量的健全性检查或改变传入/传出值,以及保护对象的内部状态。