将符号转换为对象

时间:2016-05-19 10:03:36

标签: ruby

我的方法需要一个参数。我宁愿避免像这样直接传递对象:

def print_error(Loggers::MyLogger.new, error)
  ...
end

相反,我想传递一个这样的符号:

def print_error(:my_logger, error)
  ...
end

是否有将:my_logger符号转换为MyLogger实例的优雅方法?或者我是否必须为此建立工厂机制?

3 个答案:

答案 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