ruby - массив доступа с хеш-ключом - PullRequest
0 голосов
/ 23 ноября 2018

Я изо всех сил пытаюсь понять, как я могу получить доступ к массиву с помощью хеш-ключа.В моем коде я создаю хеш с ключами и значениями.Теперь я хочу установить значения в классе Car.Всякий раз, когда я пытаюсь создать экземпляр Car, аргумент ожидает Integer, а не String.

Я получаю следующую ошибку: TypeError (no implicit conversion of String into Integer)

Вот мой код:

class Car_maker

 attr_accessor :car_maker

 def initialize(car_maker)
  @car_maker = car_maker
 end

end

class Car_model < Car_maker

attr_accessor :km, :type, :transmission, :stock, :drivetrain, :status, 
:fuel, :car_maker, :model, :year, :trim, :features
#total number of instances & array with car objects
@@totalCars = 0
@@catalogue = []

def initialize(km, type, transmission, stock, drivetrain, status, fuel, car_maker, model, year, trim, features)
    super(car_maker)
    @km = km
    @type = type
    @transmission = transmission
    @stock = stock
    @drivetrain = drivetrain
    @status = status
    @fuel = fuel
    @model = model
    @year = year
    @trim = trim
    @features = features
    @@totalCars += 1
end 

def self.convertListings2Catalogue(line)
    #Initialise arrays and use them to compare
    type = ["Sedan", "coupe", "hatchback", "station", "SUV"]
    transmission = ["auto", "manual", "steptronic"]
    drivetrain = ["FWD", "RWD", "AWD"]
    status = ["new", "used"]
    car_maker = ["honda", "toyota", "mercedes", "bmw", "lexus"]
    hash = Hash.new

    #In this part, we hash the set of features using regex
    copyOfLine = line
    regex = Regexp.new(/{(.*?)}/)
    match_array = copyOfLine.scan(regex)

    match_array.each do |line|
        hash["features"] = line
    end

    #Now, we split every comma and start matching fields
    newStr = line[0...line.index('{')] + line[line.index('}')+1...line.length]
    arrayOfElements = newStr.split(',')

    arrayOfElements.each do |value|
        if value.include?("km") and !value.include?("/")
            hash["km"] = value
        elsif type.include?(value)
            hash["type"] = value
        elsif transmission.include?(value.downcase)
            hash["transmission"] = value
        elsif value.include?("/") and value.include?("km")
            hash["fuel economy"] = value
        elsif drivetrain.include?(value)
            hash["drivetrain"] = value
        elsif status.include?(value.downcase)
            hash["status"] = value
        elsif /(?=.*[a-zA-Z])(?=.*[0-9])/.match(value) and !value.include?("km")
            hash["stock"] = value
        elsif car_maker.include?(value.downcase)
            hash["carmaker"] = value
        elsif /^\d{4}$/.match(value)
            hash["year"] = value
        elsif value.length == 2
            hash["trim"] = value
        else
            if value.length > 2
                hash["model"] = value
            end
        end 
    end 
  end
 end

 textFile = File.open('cars.txt', 'r')
 textFile.each_line{|line|
   if line.length > 2
    result = Car_model.convertListings2Catalogue(line)
    puts "Hash: #{result}"

    carObj = Car_model.new(result["km"], result["type"], result["transmission"], result["stock"], result["drivetrain"],
    result["status"], result["fuel"], result["carmaker"], result["model"], result["year"], result["trim"], result["features"])
    #@@catalogue.push (carObj)
end
}

1 Ответ

0 голосов
/ 23 ноября 2018

Эта строка

result = Car_model.convertListings2Catalogue(line)

Не возвращает объект hash.Он возвращает arrayOfElements, поскольку именно это и возвращает метод each, а метод each является последним методом, выполняемым в методе (хотя в нем есть хэш-присваивания, это только последнее значение, которое возвращается, если вы не используете явноеreturn оператор.

Просто используйте переменную hash в последней строке convertListing2Catalog метода

        if value.length > 2
          hash["model"] = value
        end
      end 
    end 
    hash # < this is the last line of the method so it's the value that will be returned
  end
end

Если подумать, в переменной было создано несколько переменных.нет никаких оснований ожидать, что будет возвращено содержимое какой-либо конкретной переменной, такой как hash, а методы ruby ​​по умолчанию возвращают последнюю выполненную команду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...