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版本,您可以使用(akainject
)。我小时候就是这样做的
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)。