2012-12-04 2 views
3

나는 좋은 해결책을 찾을 수 없다는 이상한 필요성이있다.Ruby 객체 이름을 문자열로

개체, 해시 또는 배열을 전달할 메서드가 있습니다. 그리고 내가 지나가고있는 객체, 해시 또는 배열의 이름을 가져올 수 있기를 원합니다. 여기

는 예는 다음과 같습니다에

@user = User.find(5) 

log_info("@user", @user) 

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

모든 아이디어 :이 그냥이 작업을 수행하는 데에서 저를 방지 할 수

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

: 뭔가를 기록 할

@user = User.find(5) 

log_info(@user) 

def log_info(obj) 
    Rails.logger.debug(obj.to_s) 
    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"