Как избавиться от дублирования в ruby ​​при использовании клона? - PullRequest
1 голос
/ 05 апреля 2011

Этот метод просто меняет идентификатор для любого найденного player_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"}

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

#clone требуется только потому, что вы используете мутирующие операции (<<) в строке.Использование интерполяции строк предотвращает ненужный клон, а также делает ваш код более идиоматическим.

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

В качестве бонуса, я удалил ненужные ссылки на self и заменил ваши if на and-equals.1007 *

1 голос
/ 05 апреля 2011

Вот два возможных метода, основанных на вводе и выводе вашего образца:

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"}}

Если это не то, что вам нужно, отредактируйте пример ввода / вывода вашего вопроса и опубликуйте комментарий, разъясняющий ваши потребности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...