作者:卟105932097 | 来源:互联网 | 2022-12-02 06:36
我是一个红宝石初学者并且读到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
有人可以解释"哈希没有秩序"是什么意思吗?
如果你能提供一个很棒的简单例子.
1> tadman..:
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
当您调用sort
a时Hash
,实际上最终将其转换为键/值对数组,然后对每个键/值对进行排序:
b.sort
# => [[:x, "1"], [:y, "2"]]
Hash
如果您愿意,可以将其转换回a :
b.sort.to_h
# => {:x=>"1", :y=>"2"}
所以现在它正确地"订购"了.但实际上,这很重要,因为您将根据需要单独访问密钥.b[:x]
不管:x
关键在哪里,它始终返回正确的值,无论如何.
关于Ruby的一些注意事项:
不要使用Hash.new
,而只是{ }
用来表示一个空的Hash结构.
不要对变量使用大写字母,它们在Ruby中具有重要意义. Travel_Plans
是一个常数,而不是一个变量,因为它以大写字母开头.这些是保留ClassName
和CONSTANT_NAME
类型使用.这应该是travel_plans
.
它不那么冗长,这通常是Ruby代码引导的方向,加上其他语言的映射,其中表示符号相同.对于像Hash.new(0)`或`Hash.new {| h,k | ...}`你需要自定义行为.
非常好的解释.狡辩:也许是"平等"而不是"等同".当哈希`h`没有键'k`,`fetch`和默认值(只要你走了这么远)时,考虑提一下`h [k]`.