Может ли этот код на Ruby быть написан более кратко? - PullRequest
1 голос
/ 13 января 2011
positions = Hash.new
import_profile.headings.each do |h|
  positions[h.table_name + '.' + h.column_name] = h.position
end

Как только это будет сделано, меня заинтересует positions. Это почти то же самое, что я написал бы в PHP, но меня привлекло Ruby для его функций map и collect. Есть ли способ написать это в одну строку?

Ответы [ 5 ]

4 голосов
/ 13 января 2011

Я думаю, что наиболее кратким будет что-то вроде этого.

positions = Hash[*import_profile.headings.map do|h|
    [ "#{h.table_name}.#{h.column_name}", h.position ]
  end.flatten
]

Но это не очень читабельно. Мне больше нравится ваш код.

2 голосов
/ 13 января 2011

Если вам интересно, вот как будет выглядеть решение на основе inject.Не короче, но немного больше FP-иша:

positions = import_profile.headings.inject({}) do |acc,h|
  acc["#{h.table_name}.#{h.column_name}"] = h.position
  acc
end
2 голосов
/ 13 января 2011
positions = Hash[ import_profile.headings.map do |h|
  [ "#{h.table_name}.#{h.column_name}", h.position ]
end ]

или

positions = Hash[ *import_profile.headings.map do |h|
  [ "#{h.table_name}.#{h.column_name}", h.position ]
end.flatten ]

Первый работает только в Ruby 1.8.7+, где Hash.[] разрешено получать массив массивов из двух значений. Последний работает в более ранних версиях, где Hash.[] было разрешено получать только четное количество параметров.

1 голос
/ 13 января 2011
Hash[import_profile.headings.map { |h| ["#{h.table_name}.#{h.column_name}", h.position] }]
0 голосов
/ 13 января 2011

Другой способ объединения слов - использовать join:

positions = Hash.new
import_profile.headings.each do |h|
  positions[[h.table_name, h.column_name].join(".")] = h.position
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...