2012-12-04 44 views
3

我有一個奇怪的需求,我找不到一個好的解決方案。Ruby對象名稱字符串

我有一個方法,我會傳遞一個對象,散列或數組。我希望能夠獲得我傳遞的對象,哈希或數組的名稱。

下面是一個例子:

@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 

任何想法上如何做到這一點?

+0

你想要在主叫方參數的名稱? –

+2

在上下文'log_info(@user)'中,'@ user'只是一個沒有任何名稱的參考。所以,不,你不能從'log_info(@user)'得到'@ user'的名字。 – Candide

回答

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 
2

你可以做一個小兩輪牛車 - 我得離開這個位置:

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"