理解哈希

时间:2015-02-26 02:22:21

标签: ruby hash

练习说:

  

首先创建三个名为person1,person2和person3的哈希值   密钥:first:last下的姓氏和姓氏。然后创建一个参数   哈希,以便params[:father]是person1,params[:mother]是person2,   而params[:child]是person3。例如,验证是否   params[:father][:first]具有正确的价值。

我做了

person1 = {first: "Thom", last: "Bekker"}
person2 = {first: "Kathy", last: "Bekker"}
person2 = {first: "Anessa", last: "Bekker"}

然后是Rails中的params哈希

params = {}
params[:father] = person1
params[:mother] = person2
params[:child] = person3

现在我可以要求父亲,母亲或孩子的名字或姓氏 params[:father][:first]给了我"Thom"

是什么让params[:father][:first][:last]返回错误?有没有办法让它返回"Thom Bekker"

我无法检查我提出的方式是否正确,是否有更好的方法进行锻炼?

symbol:优于symbol =>是否有理由?

3 个答案:

答案 0 :(得分:2)

在Ruby中,在Hash或其他类上使用方括号实际上是使用可用于该类对象的方法(this one)。在示例中调用这些方法时,将调用这些方法中的每一个,并在调用下一个方法之前返回其结果。所以,正如你所定义的那样:

  
      
  1. [:father]上调用params会返回person1所代表的哈希
  2.   然后在[:first]上调用
  3. {first: "Thom", last: "Bekker"},返回哈希值"Thom"
  4. 中的相应值   在[:last]上调用
  5. "Thom",这会导致错误。在字符串上调用方括号并在它们之间使用整数可以访问该索引处的字符串中的字符(person1[:first][0]返回"T"),但"Thom"无法处理方括号内的:last符号。
  6.   

有许多方法可以根据需要打印名称,其中最简单的方法是组合person1中的字符串值:

params[:father][:first] + " " + params[:father][:last] 返回"Thom Bekker"

答案 1 :(得分:2)

您的返回值是单个哈希对象

你误解了你要回来的物体的类型。 params[:father]返回单个Hash对象,而不是Array或哈希数组。例如:

params[:father]
#=> {:first=>"Thom", :last=>"Bekker"}

params[:father].class
#=> Hash

因此,您无法访问缺少的第三个元素(例如:last),因为params[:father][:first]的值中没有此类元素。

相反,你可以解构哈希:

first, last = params[:father].values
#=> ["Thom", "Bekker"]

或做更深奥的事情:

p params[:father].values.join " "
#=> "Thom Bekker"

重点是你必须首先访问Hash的,或者首先将它转换为数组,而不是像Array一样直接处理它,并尝试一次索引到多个值。

答案 2 :(得分:0)

  

所以这是我的问题,究竟是什么让params [:father] [:first] [:last]返回错误?有没有办法让那个回归“Thom Bekker”?

这两种方法都可行

  1. params[:father][:first] + params[:father][:last]
  2. params[:father].values.join(' ')
  3. 但也许最好像嵌套结构一样考虑它们:

    father = params[:father]
    name   = father[:first] + father[:last]
    puts name
    

    要回答您的上一个问题,请假装hashrocket =>symbol:之间没有区别。这是您不需要长时间照顾的地方。也许大约在第2年开始再次问这个问题,但是为了学习对待它们就好像它们是相同的。

    (完全披露,有差异,但这是一场你真的不想看到的圣战)