Не отображает соответствующие значения с ключом для Hash

Хорошо, я не здесь, чтобы спросить ответ. Но, честно говоря, я не очень хорош в переменной класса. Поэтому я был бы признателен, чтобы вы помогли мне с этим фрагментом кода.

Я читал на переменную класса в этих документах. Я кое-что понимаю. Но речь идет о применении его для моего собственного использования. Я бы запутался.

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 будет присвоено hash @@sqArray в качестве его ключа. Но теперь проблема в том, когда я создаю новый объект s1. Когда я хочу отобразить область, я хочу проверить, чтобы напечатать хэш @@ sqArray с его длиной в качестве его ключа и областью в качестве его значения. Но теперь проблема только в возвращении только его площади. например, только 114. предположим, что, например, [ 24 => 114]

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 - но, например, вы можете использовать этот магазин список всех определенных Square s:

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 не camelCase или же PascalCase), пробелы и т. д.

Другие вопросы по тегам