Ruby对象名称为字符串

时间:2012-12-04 21:02:09

标签: ruby class object logging

我有一个奇怪的需要,我找不到一个好的解决方案。

我有一个方法可以将对象,散列或数组传递给。我希望能够获得我传递的那个对象,哈希或数组的名称。

以下是一个例子:

@user = User.find(5)

log_info(@user)

def log_info(obj)
  Rails.logger.debug(obj.to_s)
  Rails.logger.debug(obj.inspect)
end

那会记录如下:

@user
{"active"=>true, "address1"=>"something", "address2"=>"", "city"=>"somewhere"} 

这只会阻止我不得不这样做:

@user = User.find(5)

log_info("@user", @user)

def log_info(heading, obj)
  Rails.logger.debug(heading)
  Rails.logger.debug(obj.inspect)
end

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:2)

你可以用一点点hackery做到这一点 - 我会把它留在这里:

class Reference
    def initialize(var_name, vars)
      @var_name = var_name
      @getter = eval "lambda { #{var_name} }", vars
    end
    def name 
      @var_name
    end
    def value
      @getter.call
    end
end
def log_info(ref)
  Rails.logger.debug(ref.name.to_s)
  Rails.logger.debug(ref.value.inspect)
end
def ref(&block)
  Reference.new(block.call, block.binding)
end
@user = "something";
log_info(ref{:@user}) # -> @user - "something"

答案 1 :(得分:1)

如果您的案例只需要使用实例变量,您可以这样做:

def log_info(obj)
  heading = instance_variables.detect {|name| instance_variable_get(name).equal?(obj) }
  Rails.logger.debug(heading)
  Rails.logger.debug(obj.inspect)
end