проблемы с рубиновыми символами в поиске хеша - PullRequest
0 голосов
/ 07 марта 2011

Я пытаюсь создать простой хеш для поиска соответствующих строк для некоторых символов (: student_number,: first_name, ...).У меня проблема с получением данных из этой функции.Вот функция

Фрагмент A

  def get_nice_column_name(col_symbol)
    column_names = { 
      :first_name => "Student's First Name",
      :last_name => "Student's Last Name", 
      :email => "Student's Email", 
      :given_name => "Student's Given Name"
    }
    return column_names[col_symbol]
  end

Вот как я его использую, но не работает :

Фрагмент B

col_titles = []
params = {:first_name => 'true', 
          :last_name => 'true', 
          :email => 'true', 
          :given_name => 'true' }

params.each do |key, value|
  if ( value == 'true')
    col_titles << get_nice_column_name(key)
  end
end

Когда я смотрю на col_titles, я ожидаю ["Имя студента", "Фамилия студента"], но на самом деле я ничего не получаю, просто [] пустой массив.

Я думал, что это былостранно, поэтому я попытался распечатать object_id символов (col_symbol в фрагменте A) и символы в хэше column_names, я получил разные object_ids.Мне интересно, почему они разные (они оба представляют одинаковые символы).Если я добавлю это к функции get_nice_column_name в фрагменте A:

    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :first_name is " + (:first_name).object_id.to_s
    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :last_name is " + (:last_name).object_id.to_s
    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :email is " + (:email).object_id.to_s
    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :given_name is " + (:given_name).object_id.to_s

, я получу это в консоли

col_symbol is 98351040, while :first_name is 1221688
col_symbol is 98351040, while :last_name is 580888
col_symbol is 98351040, while :email is 168888
col_symbol is 98351040, while :given_name is 1290648

983541040 не соответствует ни одному из {1221688, 580888168888, 1290648}.Поэтому мое get_nice_column_name бесполезно?Потому что под капотом символы разные?

Спасибо за помощь, ребята!

С уважением

1 Ответ

0 голосов
/ 07 марта 2011

Если вы используете Ruby 1.9, это более краткий способ сделать это.

column_names = { 
  :first_name => "Student's First Name",
  :last_name  => "Student's Last Name",
  :email      => "Student's Email",
  :given_name => "Student's Given Name"
}

params = {
  :first_name => 'FirstName',
  :last_name  => 'LastName',
  :email      => 'Email',
  :given_name => 'GivenName'
}
col_titles = []

col_titles = column_names.values
data = params.values_at(*column_names.keys)

col_titles # => ["Student's First Name", "Student's Last Name", "Student's Email", "Student's Given Name"]
data # => ["FirstName", "LastName", "Email", "GivenName"]

Это использует новое хэш-поведение Ruby 1.9, в котором Ruby запоминает порядок вставки и будет соблюдать этот порядок при получении ключей и значений.Вы можете сделать что-то подобное с 1.8, но вам нужно будет определить порядок столбцов в массиве, а затем использовать его для извлечения заголовков столбцов и значений данных вместо того, чтобы полагаться на column_names для установки порядка.

...