【问题标题】:Return members of a hashmap through a class get method通过类 get 方法返回 hashmap 的成员
【发布时间】:2017-12-13 15:39:37
【问题描述】:

以下返回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)

谁能解释为什么我只能检索“默认”以外的任何内容?

【问题讨论】:

  • 我强烈建议您遵循某种“红宝石入门”教程。感谢您知道如何用其他语言编写代码,但这段代码看起来就像是用另一种语言编写的!

标签: ruby-on-rails ruby class-members


【解决方案1】:

你有两个问题。首先,您在哈希中使用符号语法,仅当您的键是符号时才有效。如果您希望键是字符串,则需要使用 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 的习惯。

最后,对于 Ruby 中的变量名,use snake_case

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

【讨论】:

  • 啊哈 - 当然 : 是让 id 成为关键而不是使用参数 id,谢谢 - 也为约定指针。
  • 我现在有工作了,干杯。不知道如何“接受为正确”。
  • 或许在这里使用内置的fetch 方法比坚持使用get 更好?
  • 嗨 - 正如我在其他语言习语中所想的那样。我的思路是客户列表应该保持私有并通过 getter 访问。注意:一旦完成,该类将作为我的主要工作类的“require_relative”链接 - 它只会提供硬编码查找 - 存储在哈希中。
【解决方案2】:

看看这些代码:

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

你可以阅读here关于Hash#default方法

返回默认值,如果是 hsh 将返回的值 密钥在 hsh 中不存在

【讨论】:

  • @SergioTulentsev 确定
  • 感谢您的建议,我会复习的。我意识到代码看起来像是叠加在另一种语言上的 Ruby 单词哈哈
  • OP 正确使用了 Hash#default。其他问题导致代码无法工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
相关资源
最近更新 更多