Есть несколько «проблем», на которые я хотел бы обратить внимание в вашем методе #player_stats
, но я сосредоточусь на вашей проблеме с преобразованием хеш-значений игрока в целые числа.Для начала я делаю следующие предположения:
- Нет согласованности в том, отформатированы ли значения в виде строки или целого числа.
- Все значения имеют целочисленную форму, либо в типе
Integer
, либо в типе String
.
Я хотел бы отметить, что размер обуви может быть9.5
или 10.5
и т. Д. Это может быть причиной того, что значение обуви отформатировано как строка.Если это так, то вам необходимо принять это во внимание и преобразовать в число с плавающей запятой, используя #to_f
вместо #to_i
.Но поскольку ваш вопрос требует, чтобы это было целое число, я буду использовать #to_i
в моих примерах ниже.
Учитывая мои предположения, вы просто переберите все значения в хэше плеера и вызовете #to_i
на значение, чтобы преобразовать его в целое число.Это можно сделать с помощью следующего метода:
def convert_hash_values_to_int(hash)
hash.each do |key, value|
hash[key] = value.to_i
end
end
Вы можете вызвать этот метод внутри вашего #player_stats
метода. Обратите внимание, что этот метод изменяет исходные значения хэша на месте без создания нового хэша. Если это нежелательно, тогда вам следует использовать #inject
:
def convert_hash_values_to_int(hash)
hash.inject({}) do |result, (key, value)|
result[key] = value.to_i
result
end
end
Это создаетновый хэш с преобразованными значениями и возвращает его.
Это можно еще больше упростить, используя #each_with_object
, который также создает новый хэш вместо изменения исходного хеша:
def convert_hash_values_to_int(hash)
hash.each_with_object({}) do |(key, value), result|
result[key] = value.to_i
end
end
Этот подход не требует, чтобы вы возвращали result
в каждом цикле.Обратите внимание, что аргументы переключаются на #each_with_object
- |(key, value), result|
вместо |result, (key, value)|
.
Существует еще один подход, который вы можете использовать, который является наиболее кратким, , но он доступен только вRuby 2.4 + :
def convert_hash_values_to_int(hash)
hash.transform_values do |value|
value.to_i
end
end
Что может быть даже более кратким:
def convert_hash_values_to_int(hash)
hash.transform_values(&:to_i)
end
#transform_values
не изменяет исходный хеш.Если вы хотите изменить исходный хеш, вам нужно использовать удар:
def convert_hash_values_to_int(hash)
hash.transform_values!(&:to_i)
end