Ruby:我应该如何访问类中的实例变量?

时间:2015-10-31 12:28:41

标签: ruby class oop object design-patterns

在ruby中,您可以通过@var_name或私有getter attr_reader :var_name直接在内部访问变量。

哪个解决方案更(语义?)正确?使用溶液1或溶液2的任何优点/缺点?

解决方案1:

class Point
 def initialize(x, y)
   @x = x
   @y = y
 end

 def distance
   Math.sqrt(@x ** 2 + @y ** 2)
 end
end

解决方案2:

class Point
  def initialize(x, y)
   @x = x
   @y = y
  end

  def distance
    Math.sqrt(x ** 2 + y ** 2)
  end

private 
  attr_reader :x, :y

end

2 个答案:

答案 0 :(得分:3)

我会使用第二个选项:

class Point
  def initialize(x, y)
   @x = x
   @y = y
  end

  def distance
    Math.sqrt(x ** 2 + y ** 2)
  end

private 

  attr_reader :x, :y    
end

有两个原因:

  1. attr_reader可能是faster(正如Filip Bartuzi已经指出的那样)
  2. 使用attr_reader可能会更容易通过使用自定义getter方法替换attr_reader来重构该类。

答案 1 :(得分:0)

attr_reader :x, :y定义了以下功能:

def x
  @x
end

def y
  @y
end

因此两种方法都是等价的,实际上是相同的。在这两种情况下,效果也是similar,尽管attr_reader可以是faster,而不是其他一些变量访问方法。