Jör*_*tag 31
有几个地方这个位置可以指定,即一对夫妇被认为是"Ruby语言规范"的事情:
ISO规范没有Hash提及任何有关排序的内容:它是以这样的方式编写的:所有现有的Ruby实现都自动符合它,而不必更改,即它被编写为描述当前的Ruby实现,而不是规定性的.在编写规范时,这些实现包括MRI,YARV,Rubinius,JRuby,IronRuby,MagLev,MacRuby,XRuby,Ruby.NET,Cardinal,tinyrb,RubyGoLightly,SmallRuby,BlueRuby等.特别感兴趣的是MRI(仅实现1.8)和YARV(仅实现1.9(当时)),这意味着规范只能指定1.8和1.9共有的行为,而Hash排序则不然.
RubySpec项目被开发人员抛弃了,因为ruby-core开发人员和YARV开发人员从未认识到它.但是,它(隐式地)指定Hash文字从左到右排序:
Run Code Online (Sandbox Code Playgroud)new_hash(1 => 2, 4 => 8, 2 => 4).keys.should == [1, 4, 2]
Hash#keys然而,这是与其他规格测试Hash#values具有相同顺序的规格Hash#keys,Hash#each_value并且Hash#each_key具有相同的顺序,Hash#each_pair并且Hash#each具有相同的顺序.
我在YARV测试套件中找不到任何指定保留排序的东西.事实上,我在测试套件中找不到任何关于订购的东西,恰恰相反:测试需要很长时间以避免依赖于订购!
Flanagan/matz book kinda-sorta Hash在9.5.3.6Hash节迭代器中隐式指定了文字排序.首先,它使用与文档大致相同的公式:
但是,在Ruby 1.9中,哈希元素按其插入顺序进行迭代,[...]
但接着它继续:
[...],这就是以下示例中显示的顺序:
在这些例子中,它实际上使用了一个文字:
Run Code Online (Sandbox Code Playgroud)h = { :a=>1, :b=>2, :c=>3 } # The each() iterator iterates [key,value] pairs h.each {|pair| print pair } # Prints "[:a, 1][:b, 2][:c, 3]" # It also works with two block arguments h.each do |key, value| print "#{key}:#{value} " # Prints "a:1 b:2 c:3" end # Iterate over keys or values or both h.each_key {|k| print k } # Prints "abc" h.each_value {|v| print v } # Prints "123" h.each_pair {|k,v| print k,v } # Prints "a1b2c3". Like each
h = { a: 1, b: 2 }是相同的h = { }; h[:a] = 1; h[:b] = 2
并在另一个评论中说
没有别的意义
不幸的是,事实并非如此:
module HashASETWithLogging
def []=(key, value)
puts "[]= was called with [#{key.inspect}] = #{value.inspect}"
super
end
end
class Hash
prepend HashASETWithLogging
end
h = { a: 1, b: 2 }
# prints nothing
h = { }; h[:a] = 1; h[:b] = 2
# []= was called with [:a] = 1
# []= was called with [:b] = 2
Run Code Online (Sandbox Code Playgroud)
所以,根据你如何从书中解释这一行,并根据"规范是什么"来判断那本书,是的,文字的排序是有保证的.
Exu*_*ery 10
从文档:
哈希值按照插入相应键的顺序枚举其值.
| 归档时间: |
|
| 查看次数: |
7813 次 |
| 最近记录: |