2011-04-05 2 views
1

이 방법은 발견 된 모든 player_id의 id를 변경하는 것입니다. 리크는 그것을 싫어하지만 의미있는 방식으로 리펙토링하는 방법을 찾을 수는 없습니다.복제를 사용할 때 어떻게 루비에서 중복 제거합니까?

(1..9).each { |n| 
    n = n.to_s 
    self.player_ids[n] = self.site_id.clone << "_" << self.player_ids[n].clone if self.player_ids[n]   
} 

난 그냥 복제 기능을 허용하지 않기 때문에이 중복 함께 생활해야합니까 나에게 :

player_id = self.player_ids[n] 
player_id = self.site_id.clone << "_" << player_id.clone if player_id 

샘플 입력 :

{:player_ids => {"2" => "player_name1", "6" => "player_name4", "9" => "player_name9"} 

출력 :

{:player_ids => {"2" => "PRE_player_name1", "6" => "PRE_player_name4", "9" => "PRE_player_name9"} 
+1

self.site_id + "_"+ self.player_ids [n] self.player_ids [n]'을 (를) 사용해 볼 수 있습니까? – Dogbert

+0

이 클로닝 및 인 플레이스 (in-place) 항목은 상당히 나빠 보인다. 이거 정말 틀어? 왜 우리가 하나 이상의 (또는 그 이상) pair input/desired_output을 보여주지 않아도 당신이 원하는 것을 알아낼 수 있습니다. – tokland

+0

죄송합니다. 입력 및 출력을 표시하는 습관을 만들어야합니다. –

답변

1

다음은 두 가지 possib입니다. 샘플 입력과 출력에 따라 제작 기법 :

site_id = 'PRE' 
prefix = "#{site_id}_" 
h = {:player_ids => {"2" => "player_name1", "6" => "player_name4", "9" => "player_name9"}} 

# If mutating the original hash is not OK 
h2 = h.dup 
h2[:player_ids] = Hash[ h[:player_ids].map{ |s,n| [s, n.sub(/^/,prefix)] } ] 
p h, h2 
#=> {:player_ids=>{"2"=>"player_name1", "6"=>"player_name4", "9"=>"player_name9"}} 
#=> {:player_ids=>{"2"=>"PRE_player_name1", "6"=>"PRE_player_name4", "9"=>"PRE_player_name9"}} 

# If mutating the original hash is OK 
h[:player_ids].each{ |id_string,name| name.sub! /^/, prefix } 
p h 
#=> {:player_ids=>{"2"=>"PRE_player_name1", "6"=>"PRE_player_name4", "9"=>"PRE_player_name9"}} 

이 없습니다 당신이 원하는 경우, 귀하의 질문의 샘플 입력/출력을 편집하여 사용자의 요구를 명확히 코멘트를 게시하시기 바랍니다.

+0

고마워요! site_id = "PRE"이면 site_id.clone << "_"보다 하위에 추가하는 더 좋은 방법이 있습니까? Metrical은 내 복제본을 자주 사용하는 것을 싫어하는 것 같습니다. –

+0

@JeremySmith 'site_id'를 변수로 포함하도록 답변을 편집했습니다. – Phrogz

1

#clone은 문자열에 변형 작업 (<<)을 사용하고 있기 때문에 필요합니다. 문자열 보간법을 사용하면 불필요한 복제를 막을 수 있으며 코드를 더 관용적으로 만들 수 있습니다. 보너스로

player_ids[n] &&= "#{site_id.clone}_#{player_ids[n]}" 

, 나는 self에 불필요한 참조를 제거하고 당신과 경우와-등호를 교체했습니다.

관련 문제