Ruby 的Hash 类在传统术语中表示“哈希映射”或“键值字典”。这些旨在成为允许快速随机访问单个元素的结构,但元素本身没有内在顺序。
在内部,Ruby 的Hash 使用每个对象必须提供用作键的hash 方法将元素组织到它们在内存中的不同位置。 Ruby 的Hash 非常灵活,即使不是非常灵活,因为一个对象,任何对象,都可以用作键,并且完全按原样保存。与 JavaScript 相比,其中键 必须 是字符串并且只能是字符串。
这意味着你可以这样做:
{ 1 => 'Number One', '1' => 'String One', :one => 'Symbol One', 1.0 => 'Float One }
其中有四个完全不同的键。
这与Array 形成对比,其中排序是数组工作方式的重要组成部分。您不希望有一个队列,事情以一种顺序进行,然后以另一种顺序出现。
现在 Ruby 的 Hash 类过去没有内在顺序,但由于现在流行的需求,它以插入的形式存储顺序。也就是说,插入的第一个项目是“第一个”。通常你不会明确地依赖这种行为,但如果你注意的话,它确实会出现:
a = { x: '1', y: '2' }
# => {:x=>"1, :y=>"2"}
b = { }
b[:y] = '2'
b[:x] = '1'
b
# => {:y=>"2", :x=>"1"}
请注意,b 中的键的顺序是颠倒的,因为它们是以相反的顺序插入的。不过它们仍然是等价的:
a == b
# => true
当您在 Hash 上调用 sort 时,实际上最终会将其转换为键/值对数组,然后对其中的每一个进行排序:
b.sort
# => [[:x, "1"], [:y, "2"]]
如果需要,您可以将其转换回 Hash:
b.sort.to_h
# => {:x=>"1", :y=>"2"}
所以现在它已经正确“排序”了。但在实践中,这并不重要,因为您将根据需要单独访问密钥。 b[:x] 不关心 :x 键在哪里,它总是返回正确的值。
关于 Ruby 的一些注意事项:
- 不要使用
Hash.new,而只是使用{ }来表示一个空的Hash结构。
- 不要对变量使用大写字母,它们在 Ruby 中具有重要意义。
Travel_Plans 是常量,而不是变量,因为它以大写字母开头。这些是为ClassName 和CONSTANT_NAME 类型使用而保留的。这应该是travel_plans。