루비 초기화 메소드에서 여러 인스턴스 변수에 같은 값을 할당하는 방법은 무엇입니까? 아래 리팩토링 상대 :루비, 초기화, 변수 지정 값
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
루비 초기화 메소드에서 여러 인스턴스 변수에 같은 값을 할당하는 방법은 무엇입니까? 아래 리팩토링 상대 :루비, 초기화, 변수 지정 값
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
무엇을 한 줄에 이렇게하는 것은 당신을 구입하지만 이런 식으로 뭔가를 할 수 확실하지 :
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 }
이 시도,
@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"
해시가 공유되어 예와 비슷한 문제가 발생합니다. –
. 당신이 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
감사합니다. 도움이됩니다. 아래 내 질문에 답하십시오 : 현 상태로 유지하는 것이 가독성을 위해 최적이라고 말하는가 아니면 위의 형식을 사용하는 것이 더 좋을까요? – BC00
현상 유지는 나를 위해 작동하지만 중복을 줄이려면 Hash.new 호출을 개인 메서드 – rusty
으로 마무리 할 수 있습니다. 도움 주셔서 감사합니다. – BC00