首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ruby中判断变量是Hash还是Array的优雅方法是什么?

在Ruby中判断变量是Hash还是Array的优雅方法是什么?
EN

Stack Overflow用户
提问于 2011-03-20 14:28:23
回答 7查看 118.6K关注 0票数 160

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

代码语言:javascript
复制
if @some_var.class.to_s == 'Hash' 

我相信有一种更优雅的方法来检查@some_varHash还是Array

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-20 14:30:38

你可以这样做:

代码语言:javascript
复制
@some_var.class == Hash

或者像这样的东西:

代码语言:javascript
复制
@some_var.is_a?(Hash)

值得注意的是,"is_a?“如果类位于对象祖先树中的任何位置,则方法为true。例如:

代码语言:javascript
复制
@some_var.is_a?(Object)  # => true

如果@some_var是源自Object的散列或其他类的实例,则上述情况成立。那么,如果您希望严格匹配类类型,使用==还是instance_of?方法可能就是您要找的。

票数 288
EN

Stack Overflow用户

发布于 2013-05-29 23:17:38

首先,文字问题的最佳答案是

代码语言:javascript
复制
Hash === @some_var

但是这个问题真的应该在这里通过展示如何进行鸭子打字来回答。这有点取决于你需要什么样的鸭子。

代码语言:javascript
复制
@some_var.respond_to?(:each_pair)

代码语言:javascript
复制
@some_var.respond_to?(:has_key?)

甚至是

代码语言:javascript
复制
@some_var.respond_to?(:to_hash)

根据应用程序的不同可能是正确的。

票数 42
EN

Stack Overflow用户

发布于 2011-03-20 14:36:59

通常在ruby中,当你寻找"type“时,你实际上想要的是"duck-type”或“is quack like a duck?”。您将看到它是否响应特定的方法:

代码语言:javascript
复制
@some_var.respond_to?(:each)

您可以遍历@some_var,因为它响应:each

如果你真的想知道类型,如果它是Hash或Array,那么你可以这样做:

代码语言:javascript
复制
["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
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5367114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档