2013-03-28 4 views
0

루비 초기화 메소드에서 여러 인스턴스 변수에 같은 값을 할당하는 방법은 무엇입니까? 아래 리팩토링 상대 :루비, 초기화, 변수 지정 값

def initialize 
@weekly_stats = Hash.new {|h, k| h[k]={}} 
@report_times = Hash.new {|h, k| h[k]={}} 
@email_stats = Hash.new {|h, k| h[k]={}} 
end 

답변

3

무엇을 한 줄에 이렇게하는 것은 당신을 구입하지만 이런 식으로 뭔가를 할 수 확실하지 :

vars = %w{weekly_stats report_times email_stats} 
vars.each { |v| instance_variable_set("@#{v}", Hash.new {|h, k| h[k]={}} } 

또는 jvnill의 대답과 결합 :

%w{weekly_stats report_times email_stats}.each { |v| instance_variable_set("@#{v}", Hash.new {|h, k| h[k]={}} } 

또는 두 개의 비 중복 라인으로 그것을 깰 좋아

value = Hash.new {|h, k| h[k]={}} 
vars = %w{weekly_stats report_times email_stats} 
vars.each { |v| instance_variable_set("@#{v}", value.dup } 
+0

감사합니다. 도움이됩니다. 아래 내 질문에 답하십시오 : 현 상태로 유지하는 것이 가독성을 위해 최적이라고 말하는가 아니면 위의 형식을 사용하는 것이 더 좋을까요? – BC00

+0

현상 유지는 나를 위해 작동하지만 중복을 줄이려면 Hash.new 호출을 개인 메서드 – rusty

+0

으로 마무리 할 수 ​​있습니다. 도움 주셔서 감사합니다. – BC00

-1

이 시도,

@weekly_stats = @report_times = @email_stats = Hash.new {|h, k| h[k]={}} 

이 작동하지만, 당신은 당신이 번호에 대한 변수를 사용하는 경우는 상황에 대해서만 안전 것을 알아야한다 루비에서 불변. 당신은 문자열과 같은 일을 시도하는 경우, 예를 들어, 당신은 당신이 기대하지 않았다 어떤 행동을 끝낼 수 :

ruby-1.9.2-p180 :001 > foo = bar = "string" 
=> "string" 
ruby-1.9.2-p180 :002 > foo.upcase! 
=> "STRING" 
ruby-1.9.2-p180 :003 > bar 
=> "STRING" 
+0

해시가 공유되어 예와 비슷한 문제가 발생합니다. –

0
당신이 해시를 할당하고 있기 때문에 당신은 한 줄에이 작업을 수행 할 수

. 당신이 a을 변경하면 위의 예에서 인 Vinay의 대답

>> a = b = c = { a: 'b', c: 'd' } 
>> a # {:a=>"b", :c=>"d"} 
>> a[:a] = 2 # 2 
>> b # {:a=>2, :c=>"d"} 

를 사용 b이 변경되었습니다. 다음 코드를 한 줄이 쓰기 만 시도 할 수있는 방법이 있는지 확실하지 않습니다 대신

@weekly_stats = Hash.new {|h, k| h[k]={}} 
@report_times = @weekly_stats.dup 
@email_stats = @weekly_stats.dup 
+0

감사합니다. 현상 유지 상태가 가독성을 위해 최적이라고 말하는가 아니면 a = b = c 형식을 사용하는 것이 더 좋을까요? – BC00

+0

에 따라 다릅니다. 왜 같은 값을 가진 3 개의 변수가 필요한가요? – jvnill

+0

그 값은 시작 값입니다. 그런 다음 다른 키/값 데이터를 각 해시에 할당하고 다른 클래스로 전달합니다. – BC00