我正在尝试使用常量化将字符串转换为类名。但是,如果不存在类名或字符串为空或nil
,则会引发错误。
有什么方法可以将字符串转换为类名而不会引发错误。或仅在无法转换时才返回false。
答案 0 :(得分:4)
我讨厌Rails,它带来了大量的冗余辅助程序,通常零值。使用纯Ruby可以很容易地做到这一点:
Kernel.const_get(string) if Kernel.const_defined?(string)
如果未定义该类,则以上内容将有效地返回该类或nil
(在Ruby中为false)。
答案 1 :(得分:3)
首先,我想从上面的答案中指出一些东西。 rescue false
表示从该表达式引发的各种异常都被抢救为false。这意味着即使您拥有类NoMethodError
或RuntimeError
的异常对象,您也将返回false
,并且您的期望是常量字符串与应用程序中的常量不匹配。如果您不知道ruby中的错误处理系统如何工作,这可能会导致您花费大量的调试时间。将来也是在您的代码中引入很多错误的地方。
我看到了 ruby-on-rails 标签,因此我认为您在Rails应用程序中遇到问题。您可以使用ActiveSupport::Inflector
模块中的帮助方法。您可能不希望使用constantize
来营救safe_constantize
方法。如果项目中不存在常量,它将返回nil
。
用法示例(请注意,我没有在项目中定义Foo
常量):
# with constantize
irb(main) > 'foo'.constantize
=> NameError (wrong constant name foo)
# with safe_contantize
irb(main) > 'foo'.safe_constantize
=> nil
答案 2 :(得分:0)
怎么了?如果是例外情况,您可以执行以下操作:
the_class = your_string.constantize rescue false
在这种情况下,rescue
捕获异常并返回false
。
答案 3 :(得分:0)
您可以提供默认值,或者在with cte as (
select c.cat_id as parent_id, c.cat_id
from categories c
union all
select cte.parent_id, c.cat_id
from cte join
categories c
on cte.parentid = c.subcategory_from
)
select p.*
from products p
where p.category in (select cte.cat_id
from cte
where cte.parent_id = 1
);
的情况下提早返回,然后抢救nil
:
NameError
编辑:它比简单的长
def to_class(name)
# default to empty string
(name || "").constantize
rescue NameError
false
end
def to_class(name)
# guard against invalid input
return false if name.nil?
name.constantize
rescue NameError
false
end
但是IMO,您应该挽救最具体的错误。 string.constantize rescue false
对于简单的脚本或一些测试用例是可以的。在生产代码中,这很有风险-您可以隐藏一些应该冗长的异常。
答案 4 :(得分:0)
您可以通过以下方式来实现,
string.constantize rescue false
其他
如果您有小写的字符串或表名,也可以使用classify
方法将其转换为类名,如下所示,
string.classify.constantize rescue false
如果您有字符串'event_managers',它将返回类EventManager