在Ruby中,简单/优雅的方式是告诉特定的variables是散列还是数组?
要检查@some_var
是什么,我正在做一个
if @some_var.class.to_s == 'Hash'
我相信有一个更优雅的方式来检查@some_var
是一个Hash
或Array
。
你可以做:
@some_var.class == Hash
或者还有类似的东西:
@some_var.is_a?(Hash)
值得注意的是“is_a?” 如果类在对象血统树中的任何位置,则方法为true。 例如:
@some_var.is_a?(Object) # => true
如果@some_var是源自Object的哈希或其他类的实例,则上述条件为真。 那么,如果你想对类types进行严格匹配,使用==或者instance_of? 方法可能是你在找什么。
首先,字面问题的最佳答案是
Hash === @some_var
但这个问题真的应该通过展示如何在这里做鸭子打字来回答。 这取决于你需要什么样的鸭子。
@some_var.respond_to?(:each_pair)
要么
@some_var.respond_to?(:has_key?)
甚至
@some_var.respond_to?(:to_hash)
可能是正确的,取决于应用程序。
通常在ruby中,当你在寻找“types”的时候,你实际上是想要“鸭子式”还是“像鸭子一样呱呱叫?”。 你会看到它是否响应某种方法:
@some_var.respond_to?(:each)
你可以迭代@some_var,因为它响应:each
如果你真的想知道types,如果它是哈希或数组,那么你可以这样做:
["Hash", "Array"].include?(@some_var.class) #=> check both through instance class @some_var.kind_of?(Hash) #=> to check each at once @some_var.is_a?(Array) #=> same as kind_of
Hash === @some_var #=> return Boolean
这也可以与case语句一起使用
case @some_var when Hash ... when Array ... end
我使用这个:
@var.respond_to?(:keys)
它适用于哈希和ActiveSupport :: HashWithIndifferentAccess。
你可以使用instance_of?
例如
@some_var.instance_of?(Hash)
在实践中,你会经常想要根据variables是一个数组还是一个哈希来采取不同的行动,而不仅仅是告诉。 在这种情况下,一个优雅的成语如下:
case item when Array #do something when Hash #do something else end
请注意,您不要在item
上调用.class
方法。
irb(main):005:0> {}.class => Hash irb(main):006:0> [].class => Array