哈希查找中的ruby符号问题

时间:2011-03-06 23:40:24

标签: ruby ruby-on-rails-3 hash symbols

我正在尝试创建一个简单的哈希来查找某些符号的相应字符串(: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(代码段A中的col_symbol)和散列column_names中的符号,我得到不同的object_ids。我想知道他们为什么不同(他们都呈现相同的符号)。如果我将其添加到Snippet A中的函数get_nice_column_name:

    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,580888,168888,1290648}中的任何一个都不匹配。这是为什么我的get_nice_column_name没用?因为引擎盖下的符号不同?

感谢您的帮助!

此致

1 个答案:

答案 0 :(得分:0)

如果您使用的是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的新Hash行为,Ruby会记住插入的顺序,并在检索键和值时遵循该顺序。您可以使用1.8执行类似的操作,但是您必须定义数组中列的顺序,然后使用它来提取数据的列标题和值,而不是依赖column_names来设置顺序