2

到目前为止,这是我创建哈希的方式(根据 Codecademy)

my_hash = {
  "pay" => "low",
  "vacation" => "yes",
  "parking" => "no"
}

这是 ruby​​monk 创建哈希的新便捷方法。

chuck_norris = Hash[:punch, 99, :kick, 98, :stops_bullets_with_hands, true]

第二种技术中的冒号是语法的一部分还是字符串的一部分?如果它们只是字符串的一部分,为什么字符串不在引号中?

4

2 回答 2

2

第二种技术中的冒号是语法的一部分还是字符串的一部分?

:不是哈希创建语法的一部分,您在那里看到它,因为您的第二个示例使用符号作为键。:punch,:kick,:stops_bullets_with_hands 是Symbol对象。Hash::[]是用于创建 Hash 对象的方法。

Hash[:punch, 99, :kick, 98, :stops_bullets_with_hands, true]
     |_________| |________|
     (key,value) (key,value)

在第二个示例中,键被视为符号。但是你也可以使用 string、fixnum 等。

于 2013-07-28T15:45:58.187 回答
0

第二种技术中的冒号是语法的一部分还是字符串的一部分?如果它们只是字符串的一部分,为什么字符串不在引号中?

查看 Rubydoc 我们可以看到该Hash::[]方法具有三种形式:

Hash[ key, value, ... ] → new_hash
Hash[ [ [key, value], ... ] ] → new_hash
Hash[ object ] → new_hash

您的具体示例是第一种情况的实例,其中对象列表被解释为键值对。所以调用:

Hash[a, b, c, d, e, f]

将配对:

  • a => b
  • c => d
  • e => f

我认为您对:语法感到困惑,您可以轻松地查看SO 上的一些主题。总结一下::在这种情况下,构造一个Symbol对象。

综上所述:

Hash[:punch, 99, :kick, 98, :stops_bullets_with_hands, true]

可以表示为以下哈希:

{
    :punch => 99,
    :kick => 98,
    :stops_bullets_with_hands => true
}

其中:punch,:kick:stops_bullets_with_hands是符号99,98true对应的值。

要返回值,您可以简单地使用如下Hash#[]方法:

chuck_norris[:punch] # 99
chuck_norris[:kick] # 98
chuck_norris[:stops_bullets_with_hands] # true

请记住,您可以通过以下#to_s方法将符号转换为字符串:

:punch.to_s # "punch"
:kick.to_s # "kick"
:stops_bullets_with_hands.to_s # "stops_bullets_with_hands"
于 2013-07-28T17:48:49.413 回答