Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从哈希中返回除第一个键/值对之外的所有元素_Ruby - Fatal编程技术网

Ruby 如何从哈希中返回除第一个键/值对之外的所有元素

Ruby 如何从哈希中返回除第一个键/值对之外的所有元素,ruby,Ruby,我想返回散列中的所有元素,不包括第一个键/值对 我的经验有限,所以我使用的是。除了,因为它是非破坏性的 h={a:1,b:2,c:3} #我想回去 h={b:2,c:3} #使用此代码 h、 排除(:a) #或者类似的东西 h.except(:a)将与rails/activesupport一起使用,但它要求您知道密钥的名称 寻址第一个元素更为棘手,因为散列作为一种数据结构,对键值对没有顺序。但好消息是,在ruby(或至少是MRI/YARV)中,哈希确实保持插入顺序,并且在迭代键值对时会反映出来。

我想返回散列中的所有元素,不包括第一个键/值对

我的经验有限,所以我使用的是
。除了
,因为它是非破坏性的

h={a:1,b:2,c:3}
#我想回去
h={b:2,c:3}
#使用此代码
h、 排除(:a)
#或者类似的东西
h.except(:a)
将与rails/activesupport一起使用,但它要求您知道密钥的名称

寻址第一个元素更为棘手,因为散列作为一种数据结构,对键值对没有顺序。但好消息是,在ruby(或至少是MRI/YARV)中,哈希确实保持插入顺序,并且在迭代键值对时会反映出来。所以你可以这样做:

pairs = h.to_a # get all KV pairs as an array
except_first = pairs[1..-1] # discard the first KV pair
except_first.to_h # make a hash
或者,更简洁地说

h.drop(1).to_h
请注意,
散列的“first”概念有点可疑。Ruby中的
Hash
es确实是按插入顺序的,因此在每个平台上的每个实现中都可以依赖它,但一般来说,
Hash
的目的是按键查找值,而不是依赖顺序

例如,不能保证
:a
将是示例中的第一个键。这完全取决于
散列的创建方式以及键的添加顺序

也就是说,有一种方法可以完全满足您的需要:删除
可枚举
的第一个
n
元素,它的名称就不足为奇了

注意,由于它是一个
可枚举的
方法,所以它对
哈希
es一无所知,它知道的唯一方法是。因此,它将返回一个
数组
,该数组由
产生,在
散列
的情况下,它是两个元素的
[键,值]
对:

h.drop(1)
#=> [[:b, 2], [:c, 3]]
幸运的是,有一种方法可以将两个元素
数组
可枚举
转换为
散列
,即:

您可以使用as:


我不喜欢将散列转换为数组,操纵数组,然后将修改后的数组转换回散列,所以我使用了


对于rails,
除了
之外应该可以使用。@SergioTulentsev哦,好吧,我不知道它只适用于rails。非常感谢。它是ActiveSupport的一部分,这意味着默认情况下它存在于Rails中,但是如果你需要ActiveSupport,其他应用程序可以使用它。我喜欢,但它是破坏性的。这主要是迂腐,但这种方法的缺点是,它会迭代散列中的每个键值对,即使您知道块只会在第一次迭代中返回truthy。@Jordan,我试图避免这种情况,但想不出一种(非破坏性的)解决方案不枚举所有键值对。不管怎样,不是所有的解决方案(包括到数组的转换和从数组到散列的转换)都会这样做吗?你有什么想法吗?…但是你知道钥匙的名字:
h.first.first
@CarySwoveland:
h。除了(h.first.first)
是实心钥匙外
h.drop(1).to_h
#=> { b: 2, c: 3 }
h = {a: 1, b: 2, c: 3}
h.tap(&:shift) # => {:b=>2, :c=>3}
h = {a: 1, b: 2, c: 3}
h.reject { |k,_| k == h.first.first }
  #=> {:b=>2, :c=>3} 
h.reject.with_index { |_,i| i.zero? }
  #=> {:b=>2, :c=>3} 
x = 1
h.reject { (x -= 1).zero? }
  #=> {:b=>2, :c=>3}