了解Ruby Setters

时间:2017-01-04 03:21:39

标签: ruby

如果我创建一个这样的类:

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?

3 个答案:

答案 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,则可以为其定义访问器。

此外,访问器方法允许您执行一定数量的健全性检查或改变传入/传出值,以及保护对象的内部状态。