Возврат членов hashmap через метод get класса

Следующее возвращает default"client?":

class ClientMap
    def initialize
        @@clients = {"DP000459": "BP"}
        @@clients.default = "client?"
    end

    def get(id)
        return @@clients[:id]
    end
end

clientMap = ClientMap.new
cKey = "DP000459"
puts clientMap.get(cKey)

Кто-нибудь может объяснить, почему я не могу получить ничего, кроме "по умолчанию"?

2 ответа

Решение

У тебя две проблемы. Во-первых, вы используете символьный синтаксис в вашем хэше, который работает, только если ваши ключи являются символами. Если вы хотите, чтобы ключи были строками, вам нужно использовать синтаксис hash-rocket: @@clients = {'DP000459' => 'BP'},

Во-вторых, ваш метод возвращает clients[:id] независимо от того, какой параметр предоставляется. Ключ является символом :id а не локальная переменная id, Вы должны изменить это на @@clients[id],

Вот исправленная версия того, что вы хотите:

class ClientMap

  def initialize
    @@clients = {'DP000459' => 'BP'}
    @@clients.default = 'client?'
  end

  def get(id)
    @@clients[id]
  end
end

Я также позволил себе сделать интервал более руби-идиоматическим.

Наконец, для имен переменных в Ruby используйте snake_case:

>> client_map = ClientMap.new
>> c_key = 'DP000459'
>> client_map.get(c_key)
#> "BP"

Посмотрите на этот код:

h = { foo: 'bar' }               # => {:foo=>"bar"}
h.default = 'some default value' # => "some default value"
h[:foo]                          # => "bar"
h[:non_existing_key]             # => "some default value"

Вы можете прочитать здесь о методе Hash#default

Возвращает значение по умолчанию, значение, которое будет возвращено hsh, если ключ не существует в hsh

Другие вопросы по тегам