0

好吧,我不是来寻求答案的。但老实说,我在类变量方面并不是很好。所以我很感激你能指导我使用这段代码。

我已经阅读了那些文档中的类变量。我有些什么样的理解呢。但它涉及到应用它为我自己的使用。我会感到困惑。

class Square

   @@sqArray = {}

    #attr_accessor :length

   def initialize
      if defined?(@@length)
        randno = "%s" % [rand(20)]
        @@length = randno.to_i
        @@sqArray = @@length

    else 
        randno = "%s" % [rand(20)]
        @@length = randno.to_i
        @@sqArray = @@length
    end
   end

   def Area
         @@area = @@length * @@length
         return @@area
         @@sqArray[@@length.to_sym] = @@area
         puts @@sqArray
   end  
   end

        s1 = Square.new
        puts s1.Area

让我解释一下这段代码。基本上每次我创建一个 Square 对象时,它都会去初始化方法。将生成一个随机数并将其传递给@@length,并将@@length 分配给散列@@sqArray 作为它的键。但现在问题是当我创建一个新对象 s1 时。当我想显示区域时,我想测试以打印散列@@sqArray,其长度为键,区域为值。但现在的问题是只返回它的区域。例如仅 114。假设是 [24 => 114]

4

1 回答 1

1

在定义对象的属性(即它的length)时,正确的方法是使用实​​例变量,而不是类变量。这是因为(在您的特定示例中),length是特定的属性,square而不是适用于所有正方形的属性。您的代码应如下所示:

class Square
  def initialize(length = rand(20))
    @length = length
  end

  def area
    @length * @length
  end
end

s1 = Square.new
puts s1.area

现在,我有点不清楚您究竟打算通过使用该类变量来实现什么@@sqArray- 但例如,您可以使用此存储所有已定义Squares 的列表:

class Square
  @@squares_list = []
  def self.all_known
    @@squares_list
  end

  def initialize(length = rand(20))
    @length = length
    @@squares_list << self
  end

  def area
    @length * @length
  end
end

这将允许您编写如下代码:

s1 = Square.new     #=> #<Square:0x0000000132dbc8 @length=9>
s2 = Square.new(20) #=> #<Square:0x000000012a1038 @length=20>
s1.area             #=> 81
s2.area             #=> 400
Square.all_known    #=> [#<Square:0x0000000132dbc8 @length=9>, #<Square:0x000000012a1038 @length=20>]

然而,类变量有一些奇怪的行为和有限的用例;我通常建议你在开始学习 Ruby 时避免使用它们。阅读ruby​​ 风格指南,了解一些关于最佳实践的常见约定——包括变量/方法命名(snake_case不使用camelCaseor PascalCase)、空格等。

于 2017-01-03T10:39:21.667 回答