3

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

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

这是一个例子:

@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

关于如何做到这一点的任何想法?

4

2 回答 2

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"
于 2012-12-04T21:20:37.443 回答
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
于 2012-12-04T21:20:21.050 回答