我的方法需要一个参数。我宁愿避免像这样直接传递对象:
def print_error(Loggers::MyLogger.new, error)
...
end
相反,我想传递一个这样的符号:
def print_error(:my_logger, error)
...
end
是否有将:my_logger
符号转换为MyLogger
实例的优雅方法?或者我是否必须为此建立工厂机制?
答案 0 :(得分:2)
在Rails中,有一个帮助器为constantize
准备好了:
:my_logger.to_s.camelize.constantize
#⇒ MyLogger
在Ruby中,可以使用Module#const_get
:
klazz = :my_logger.to_s.gsub(/(\A|_)(.)/) { |m| m[-1].upcase }
const_get(klazz) if const_defined?(klazz)
#⇒ MyLogger
答案 1 :(得分:1)
首先,我们将:my_logger
转换为字符串“MyLogger”(参考:Converting string from snake_case to CamelCase in Ruby):
camel_str = :my_logger.to_s.camelize
然后我们使用带有类名称的字符串来创建对象(ref:How do I create a class instance from a string name in ruby?):
obj = Object.const_get(camel_str)
所以把所有东西放在一起:
camel_str = :my_logger.to_s.camelize
obj = Object.const_get(camel_str)
答案 2 :(得分:-1)
好吧,如果是关于将符号转换为对应的类(如果存在的话),那么这个呢?
class Symbol
def to_ob
eval(self.to_s)
end
end
:String.to_ob #=>String