TypeError: неявное преобразование символа в Integer
У меня возникает странная проблема при попытке изменить значения из Hash. У меня есть следующая настройка:
myHash = {
company_name:"MyCompany",
street:"Mainstreet",
postcode:"1234",
city:"MyCity",
free_seats:"3"
}
def cleanup string
string.titleize
end
def format
output = Hash.new
myHash.each do |item|
item[:company_name] = cleanup(item[:company_name])
item[:street] = cleanup(item[:street])
output << item
end
end
Когда я выполняю этот код, я получаю: "TypeError: неявное преобразование символа в Integer", хотя вывод элемента [: company_name] является ожидаемой строкой. Что я делаю неправильно?
Ответы
Ответ 1
Ваша переменная item
содержит экземпляр Array
экземпляра Array
(в формате [hash_key, hash_value]
), поэтому он не ожидает Symbol
в методе []
.
Вот как вы могли это сделать, используя Hash#each
:
def format(hash)
output = Hash.new
hash.each do |key, value|
output[key] = cleanup(value)
end
output
end
или без этого:
def format(hash)
output = hash.dup
output[:company_name] = cleanup(output[:company_name])
output[:street] = cleanup(output[:street])
output
end
Ответ 2
Эта ошибка появляется, когда вы обрабатываете массив или строку как хэш. В этой строке myHash.each do |item|
вы присваиваете item
двухэлементному массиву [key, value]
, поэтому item[:symbol]
выдает ошибку.
Ответ 3
Вы, вероятно, имели в виду следующее:
require 'active_support/core_ext' # for titleize
myHash = {company_name:"MyCompany", street:"Mainstreet", postcode:"1234", city:"MyCity", free_seats:"3"}
def cleanup string
string.titleize
end
def format(hash)
output = {}
output[:company_name] = cleanup(hash[:company_name])
output[:street] = cleanup(hash[:street])
output
end
format(myHash) # => {:company_name=>"My Company", :street=>"Mainstreet"}
Прочитайте документацию по Hash # each
Ответ 4
myHash.each{|item|..}
возвращает объект массива для item
итеративной переменной следующим образом: -
[:company_name, "MyCompany"]
[:street, "Mainstreet"]
[:postcode, "1234"]
[:city, "MyCity"]
[:free_seats, "3"]
Вы должны сделать это: -
def format
output = Hash.new
myHash.each do |k, v|
output[k] = cleanup(v)
end
output
end