在Ruby中,简单/优雅的方式是告诉特定的variables是散列还是数组?

要检查@some_var是什么,我正在做一个

 if @some_var.class.to_s == 'Hash' 

我相信有一个更优雅的方式来检查@some_var是一个HashArray

你可以做:

 @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