我想做一个ruby gem,它标准化了一系列的API。
与连接到每个应用程序接口相关的逻辑需要抽象到.rb文件中。为了加载API的每个逻辑,我遍历了一个文件夹的文件:
# Require individual API logic
Dir[File.dirname(__FILE__) + "/standard/apis/*.rb"].each do |file|
require file
end每个API都是StandardAPI的常量,所以我可以在每个API上迭代一些代码:
StandardAPI.constants.each do |constant|
# Standardize this stuff
end但是,我也有一个VERSION常量。它在我的应用程序接口逻辑类上循环得很好,但是当我到达VERSION时,我遇到了:
:VERSION is not a class/module (TypeError)
如何遍历每个API而忽略那些不是我需要的类的常量?
发布于 2013-09-10 16:30:36
由于Module#constants返回一个符号数组,因此您必须首先使用Module#const_get查找常量
Math.const_get(:PI) #=> 3.141592653589793
StandardAPI.const_get(:VERSION) #=> the value for StandardAPI::VERSION然后你可以检查它是否是一个类:
Math.const_get(:PI).class #=> Float
Math.const_get(:PI).is_a? Class #=> false
StandardAPI.const_get(:VERSION).is_a? Class #=> false要过滤所有类,请执行以下操作:
StandardAPI.constants.select { |sym| StandardAPI.const_get(sym).is_a? Class }另一种方法是收集子类,可能使用Class#inherited
# 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]发布于 2013-09-10 16:09:42
看起来你应该能够使用is_a?了
class Test
end
Test.is_a?(Class)
=> true
VERSION = 42
VERSION.is_a?(Class)
=> false发布于 2013-09-10 16:09:32
我想您可以捕获该异常并继续进行
StandardAPI.constants.each do |constant|
begin
# Standardize this stuff
rescue TypeError
next
end
end或者就像@jonas提到的那样
StandardAPI.constants.each do |constant|
if constant.is_a?(Class)
# Standardize this stuff
end
endhttps://stackoverflow.com/questions/18713339
复制相似问题