首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby检查constant是否为类

Ruby检查constant是否为类
EN

Stack Overflow用户
提问于 2013-09-10 15:50:19
回答 3查看 839关注 0票数 3

我想做一个ruby gem,它标准化了一系列的API。

与连接到每个应用程序接口相关的逻辑需要抽象到.rb文件中。为了加载API的每个逻辑,我遍历了一个文件夹的文件:

代码语言:javascript
复制
# Require individual API logic
Dir[File.dirname(__FILE__) + "/standard/apis/*.rb"].each do |file|
  require file
end

每个API都是StandardAPI的常量,所以我可以在每个API上迭代一些代码:

代码语言:javascript
复制
StandardAPI.constants.each do |constant|
  # Standardize this stuff
end

但是,我也有一个VERSION常量。它在我的应用程序接口逻辑类上循环得很好,但是当我到达VERSION时,我遇到了:

:VERSION is not a class/module (TypeError)

如何遍历每个API而忽略那些不是我需要的类的常量?

EN

回答 3

Stack Overflow用户

发布于 2013-09-10 16:30:36

由于Module#constants返回一个符号数组,因此您必须首先使用Module#const_get查找常量

代码语言:javascript
复制
Math.const_get(:PI)              #=> 3.141592653589793
StandardAPI.const_get(:VERSION)  #=> the value for StandardAPI::VERSION

然后你可以检查它是否是一个类:

代码语言:javascript
复制
Math.const_get(:PI).class                    #=> Float
Math.const_get(:PI).is_a? Class              #=> false
StandardAPI.const_get(:VERSION).is_a? Class  #=> false

要过滤所有类,请执行以下操作:

代码语言:javascript
复制
StandardAPI.constants.select { |sym| StandardAPI.const_get(sym).is_a? Class }

另一种方法是收集子类,可能使用Class#inherited

代码语言:javascript
复制
# standard_api/base.rb
module StandardAPI
  class Base
    @apis = []

    def self.inherited(subclass)
      @apis << subclass
    end

    def self.apis
      @apis
    end
  end
end

# standard_api/foo.rb
module StandardAPI
  class Foo < Base
  end
end

# standard_api/bar.rb
module StandardAPI
  class Bar < Base
  end
end

StandardAPI::Base.apis
#=> [StandardAPI::Foo, StandardAPI::Bar]
票数 4
EN

Stack Overflow用户

发布于 2013-09-10 16:09:42

看起来你应该能够使用is_a?

代码语言:javascript
复制
class Test
end

Test.is_a?(Class)
=> true

VERSION = 42

VERSION.is_a?(Class)
=> false
票数 3
EN

Stack Overflow用户

发布于 2013-09-10 16:09:32

我想您可以捕获该异常并继续进行

代码语言:javascript
复制
StandardAPI.constants.each do |constant|
  begin
    # Standardize this stuff
    rescue TypeError
      next
  end
end

或者就像@jonas提到的那样

代码语言:javascript
复制
StandardAPI.constants.each do |constant|
  if constant.is_a?(Class)
    # Standardize this stuff
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18713339

复制
相关文章

相似问题

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