我是一个红宝石初学者并且读到Hash没有订单.我尝试使用这个概念,但发现我仍然可以订购这样的东西:
Travel_Plans = Hash.new
Travel_Plans[4] = "Colorado Springs"
Travel_Plans[1] = "Santa Fe"
Travel_Plans[2] = "Raton"
Travel_Plans[5] = "Denver"
Travel_Plans[3] = "Pueblo"
puts Travel_Plans.sort
Run Code Online (Sandbox Code Playgroud)
有人可以解释"哈希没有秩序"是什么意思吗?
如果你能提供一个很棒的简单例子.
Ruby的Hash类用传统术语表示"哈希映射"或"键值字典".这些是旨在允许快速随机访问单个元素的结构,但元素本身没有内在的顺序.
内部Ruby Hash使用hash每个对象必须提供的方法将元素组织到内存中的各个位置以用作键.Ruby的Hash异常,即使不是非常灵活,因为一个对象,任何对象都可以用作一个键,并且它保持原样.与JavaScript对比,其中键必须只是字符串和字符串.
这意味着你可以这样做:
{ 1 => 'Number One', '1' => 'String One', :one => 'Symbol One', 1.0 => 'Float One }
Run Code Online (Sandbox Code Playgroud)
那里有四个完全不同的键.
这与Array排序是数组如何工作的重要部分的情况形成对比.你不希望有一个队列,其中的东西在一个顺序中出现而在另一个顺序中出现.
现在Ruby的Hash类曾经没有内在的顺序,但由于受欢迎的需求,它现在按插入方式存储顺序.也就是说,插入的第一个项目是"第一个".通常情况下,您不会明确依赖此行为,但如果您正在关注它,它会显示出来:
a = { x: '1', y: '2' }
# => {:x=>"1, :y=>"2"}
b = { }
b[:y] = '2'
b[:x] = '1'
b
# => {:y=>"2", :x=>"1"}
Run Code Online (Sandbox Code Playgroud)
请注意,b由于以相反的顺序插入键,因此键的顺序是相反的.它们仍然是等价的:
a == b
# => true
Run Code Online (Sandbox Code Playgroud)
当您调用sorta时Hash,实际上最终将其转换为键/值对数组,然后对每个键/值对进行排序:
b.sort
# => [[:x, "1"], [:y, "2"]]
Run Code Online (Sandbox Code Playgroud)
Hash如果您愿意,可以将其转换回a :
b.sort.to_h
# => {:x=>"1", :y=>"2"}
Run Code Online (Sandbox Code Playgroud)
所以现在它正确地"订购"了.但实际上,这很重要,因为您将根据需要单独访问密钥.b[:x]不管:x关键在哪里,它始终返回正确的值,无论如何.
关于Ruby的一些注意事项:
Hash.new,而只是{ }用来表示一个空的Hash结构.Travel_Plans是一个常数,而不是一个变量,因为它以大写字母开头.这些是保留ClassName和CONSTANT_NAME类型使用.这应该是travel_plans.| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |