Подтвердить что ты не робот

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] является ожидаемой строкой. Что я делаю неправильно?

4b9b3361

Ответ 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