Ruby 从嵌套哈希中获取值

Ruby 从嵌套哈希中获取值,ruby,Ruby,我使用这个散列来存储值,如果找不到这些值,则获取默认值: AMOUNT = { EUR: { eps: { AT: 1_00 }, safetypay: { PE: 15_000_00, CR: 5_000_00, BE: 15_000_00, }, przelewy24: 5_00, qiwi: 5_00, bcmc: { AT: 1_00, BE: 1_00 }, giropay:

我使用这个散列来存储值,如果找不到这些值,则获取默认值:

AMOUNT = {
  EUR: {
    eps:         { AT: 1_00 },
    safetypay:   { PE: 15_000_00, CR: 5_000_00, BE: 15_000_00, },
    przelewy24:  5_00,
    qiwi:        5_00,
    bcmc:        { AT: 1_00, BE: 1_00 },
    giropay:     { DE: 1_00 },
    ideal:       { NL: 1_00 },
    mybank:      { IT: 1_00, FR: 1_00 },
  },
  CZK: {
    trustpay:   { CZ: 20_00 }
  }
}.with_indifferent_access
我希望基于键获取值,因此我尝试了以下方法:

def amount_for(payment_type, country, currency)
  payment_amount = AMOUNT.dig(currency, payment_type, country) if payment_type.is_a?(Hash)
  payment_amount ||= AMOUNT.dig(currency, payment_type)
  payment_amount ||= 1
end
但我得到的结果不是数字,而是
{“AT”=100,“BE”=100}
。如果我删除检查
If payment\u type.is\u a?(散列)
我得到异常
Integer没有dig方法(运行时错误)


你知道我如何解决这个问题吗?

付款类型将是,例如,
“AT”
-这是传递给函数的参数,它永远不会是散列

此重写应满足您的要求:

def amount_for(payment_type, country = nil, currency = nil)
  path = [payment_type, country, currency].compact
  obj = AMOUNT
  obj = obj[path.shift] while Hash === obj && !path.empty?
  return obj || 1
end
或者,这与您编写的代码非常相似:

def amount_for(payment_type, country = nil, currency = nil)
  tmp = AMOUNT.dig(payment_type, country, currency)
  return tmp if tmp
  tmp = AMOUNT.dig(payment_type, country)
  return tmp if tmp
  tmp = AMOUNT.dig(payment_type)
  return tmp if tmp
  return 1
end

如何调用
方法的
amount\u,即导致意外结果/错误的参数是什么?请给我一些提示如何修复它?最后一行是提示。您需要将
if payment\u type.is\u a?(散列)
更改为
if AMOUNT[payment\u type]。is\u a?(散列)
。奇怪的是,我仍然得到值
{“NL”=100}
哦,我忽略了一些东西。我本应该说
金额[货币][付款类型]
,但由于涉及特殊情况的各种原因,这是错误的。我会重写答案的。嗯。。。在任何情况下,我的金额都是1。