Не отображает соответствующие значения с ключом для 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
), пробелы и т. д.