从 Ruby 数组的哈希表中获取第一个元素

13
我有一个类似这样的 Ruby 哈希表:
h = {"side1"=>["green", "Green"], "side2"=>["verde", "Verde"]}

我该如何在哈希表中获取特定键的第一个(或最后一个)元素?


2
puts h['side2].first 是完全有效的语法。puts h['side2][0] 也可以工作。 - Victor Deryagin
2
我不明白为什么人们要对这个问题进行负评。虽然我是 StackOverflow 的新手,但在这里似乎负评是一种 RTFM 的表现。如果问题清晰且可以从中学到东西,那在我看来就是好问题。 - BF4
按需求来说,我不确定为什么会需要这个功能。如果数据结构被正确使用并且实现也同样好(没有任何技巧);那么你就不需要这个功能了。毕竟,你只需要通过键选择哈希元素,而无需其他操作或者我们使用数组。此外,问题应该只是“哈希的第一个元素”,在哈希中使用数组将意味着其他事情。 - Ninad
我认为我可以解释这些踩踏:很明显你甚至没有尝试过你的“伪代码”,因为如果你尝试了,你就会注意到它是有效的。你在irb中发现答案所花费的时间比在StackOverflow上输入问题要少。 - Mark Thomas
4个回答

9

实际上,你在问题中给出的伪代码是正确的。

针对你的哈希表

h = {
   "side1" => ["green", "Green"], 
   "side2" => ["verde", "Verde"]
}

这些键是'side1''side2'(它们的值在哈希箭头的右边)

因此,h['side2'].first表示对于键'side2'的值,获取值["verde", "Verde"]中的第一个元素,它是一个数组。h['side2'][0]也可以使用。别名first是一个方便的方法。

要获取数组的最后一个元素而不必知道其大小,请使用负索引。例如:h['side2'][-1],在这种情况下等同于h['side2'][1]

请注意,哈希中的键对字符串或符号有特定的要求。例如h[:side2]将返回nil,因为尚未设置该键。Rails有一个HashWithIndifferentAccess类,将符号和字符串视为等效的键。

编辑

我应该提到我在irb中测试了我的答案。 irb是测试您的想法是否可行的好方法。在终端提示符中,输入irb,然后回车,使用ruby进行编程实验。


谢谢!我没有尝试自己的答案,因为我认为它不会起作用。我是使用Ruby Hash的新手。 - Andrew
irb非常有用,特别是当你想玩弄功能时,因为Ruby非常动态,你可以做任何事情。我一直在使用它,比如(修改后可粘贴在一行上):class String; def wild; "wild"; end; end; bar = "foo"; puts bar.wild; def bar.wild; "and crazy"; end; puts bar.wild。 - BF4

7

我遇到了一个类似的情况,我需要从哈希表中随便获取“第一个”条目来进行测试代码。这并不完全是这个问题所涉及的,但在我搜索时出现了这种情况,因此我认为它可能也会对其他人有用。

当然,在哈希表中,“第一项”是任意的,但是keys方法将返回按某种魔法排序的所有键的列表。如果您喜欢这种排序顺序,那么您可以使用“first”方法来获取第一个元素。

h[h.keys.first]

6
任何哈希表都有键和值,你可以轻松地创建它们。
hash.values.first
hash.values.last
hash.keys.first
hash.keys.last

因此,如果是第一个或最后一个情况,您将拥有所需的值数组。

2

是的。puts h["side2"].first 应该可以工作。我猜这表明Ruby遵循最少惊奇原则,你的伪代码实际上与实际代码相同。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接