有时我需要处理键/值数据。
我不喜欢使用Arrays,因为它们的大小不受限制(很容易意外添加2个以上的项目,而且最后需要验证大小)。此外,0
和1
的索引成为幻数并且在传达意义方面表现不佳("当我说0时,我的意思是head
...&#34 ;)
哈希也不合适,因为可能会意外添加额外的条目。
我编写了以下类来解决问题:
class Pair
attr_accessor :head, :tail
def initialize(h, t)
@head, @tail = h, t
end
end
它运行良好并解决了这个问题,但我很想知道:Ruby标准库是否已经提供了这样的类?
答案 0 :(得分:3)
不,Ruby没有标准Pair
类。
您可以查看“Using Tuples in Ruby?”。
解决方案涉及使用与您类似的类,Tuples gem或OpenStruct。
Python有tuple
,但即便是Java也没有:“A Java collection of value pairs? (tuples?)”。
答案 1 :(得分:3)
您还可以使用OpenStruct数据类型。可能不完全是你想要的,但这是一个实现...
require 'ostruct'
foo = OpenStruct.new
foo.head = "cabeza"
foo.tail = "cola"
最后,
puts foo.head
=> "cabeza"
puts foo.tail
=> "cola"
答案 2 :(得分:2)
不,Ruby核心库或标准库中没有这样的类。不过,为元组提供核心库支持(以及文字语法)会很不错。
我曾经尝试过一个与你的类非常相似的类,以便用yielded
替换Hash#each
的数组。我发现猴子修补Hash#each
返回一对而不是一个数组实际上打破了很少的代码,只要该对类适当地响应to_a
和to_ary
:
class Pair
attr_reader :first, :second
def to_ary; [first, second] end
alias_method :to_a, :to_ary
private
attr_writer :first, :second
def initialize(first, second)
self.first, self.second = first, second
end
class << self; alias_method :[], :new end
end
答案 3 :(得分:0)
您不需要特殊的类型,可以使用带有两个辅助元素的2元素数组来给两对提供一致的顺序。例如:
def pair(a, b)
(a.hash < b.hash) ? [a, b] : [b, a]
end
distances = {
pair("Los Angeles", "New York") => 2_789.6,
pair("Los Angeles", "Sydney") => 7_497,
}
distances[ pair("Los Angeles", "New York") ] # => 2789.6
distances[ pair("New York", "Los Angeles") ] # => 2789.6
distances[ pair("Sydney", "Los Angeles") ] # => 7497