Ruby #挖掘包装器方法以接受动态数量的变量

Ruby #挖掘包装器方法以接受动态数量的变量,ruby,Ruby,我正在尝试编写一个方法,该方法接受未知数量的参数并对其执行哈希挖掘 def unknown_dig(hash, *args) # do some magic? hash.dig(non_array_args) end #example usage unknown_dig(hash, 'a', 'b', 'c') 这可能吗 Hash#dig(在Ruby 2.3中定义)已经做到了这一点: hash = { a: { b: 1 } } hash.dig(:a, :b) == hash.di

我正在尝试编写一个方法,该方法接受未知数量的参数并对其执行哈希挖掘

def unknown_dig(hash, *args)
  # do some magic?
  hash.dig(non_array_args)
end

#example usage
unknown_dig(hash, 'a', 'b', 'c')
这可能吗

Hash#dig(在Ruby 2.3中定义)已经做到了这一点:

hash = { a: { b: 1 } }
hash.dig(:a, :b) == hash.dig(*[:a, :b])
如果您想使其更具功能性(将散列作为参数传递,而不是对其调用方法),那么很容易:

def hash_dig(hash, *args)
  hash.dig(*args)
end
是在Ruby v2.3中授予我们的。要支持早期的Ruby版本,您可以使用(aka
inject
)。我小时候就是这样做的

def dig_it(h,*keys)
  keys.reduce(h) { |obj,k| obj && obj[k] }
end

h = { a: { b: 1 } }

dig_it(h, :a, :b)
  #=> 1 
dig_it(h, :a)
  #=> {:b=>1} 
dig_it(h, :a, :c)
  #=> nil 
dig_it(h, :c, :b)
  #=> nil 

如果
obj
是一个散列,就像它最初(
h
)一样,当
k
被传递到块
obj[k]#=>nil
如果
obj
没有键
k
(或者如果
obj
有一个键
k
,其值如果
nil
),在这种情况下
obj&&obj&&obj[k]/nil>。因此,对于传递到块的
的每个剩余元素,块计算将是
obj和&obj[k]#=>nil和&obj[k]#=>nil
。(
nil[k]
将引发异常,但它从未执行。)如果哈希
obj
有一个值为
false
的键
k
,则会产生相同的结果,只会返回
false
(而不是
nil
?您在哪里找到了这方面的文档?我在看这个,这里的关键字是splash操作符
*
而不是
dig
本身。@用户友好:您发布的链接显示dig需要一个或多个键:
dig(key…)
我认为他们不需要功能样式,我们不应该在Ruby中鼓励这种做法。@akuhn我不明白你为什么不鼓励Ruby中的功能实践。我不是想说它是OOP的替代品,我的意思是使用的语法OP类似于函数式风格(我一直在学习Erlang)。