【问题标题】:What's the proper way to check if a constant is defined?检查是否定义了常量的正确方法是什么?
【发布时间】:2017-07-18 00:59:15
【问题描述】:

我有一个字符串,我只想检查它是否是一个“模型”......所以在搜索后我找到了一种方法:

'any_name'.classify.constantize

但是...当它不是有效的模型名称时,它会抛出以下错误:

NameError(错误的常量名称 AnyName):

所以我尝试执行以下操作:

if Object.const_defined?('AnyName')
  #...
end

# I also tried this:
Object.const_get('AnyName')

但同样,以上两个选项都返回相同的错误:

NameError(错误的常量名称 AnyName):

const_defined 不应该只返回真/假而不是抛出错误?

目前,我发现了这个丑陋的解决方法:

'any_name'.classify.constantize rescue nil

但是 AFAIK 认为这不是一个好的做法(rubocop 也在声称这一点)。

那么,我的问题是……有没有一种安全的方法可以做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5 ruby-on-rails-5.1


    【解决方案1】:

    有一个方法 safe_constantize 可以帮助你,如果没有定义它会返回 nil

    "ModelName".classify.safe_constantize
    

    这是safe_constantize的链接

    【讨论】:

    • 谢谢。这正是我想要的:) 顺便说一句,你能告诉我为什么Object.const_defined? 会返回错误而不是简单的true/false
    • 此链接可以更好地解释您的问题 .const_defined? stackoverflow.com/a/5758492/938947
    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 2019-10-31
    • 2017-01-10
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多