Ruby有一个`Pair`数据类型吗?

时间:2017-02-07 15:39:20

标签: ruby

有时我需要处理键/值数据。

我不喜欢使用Arrays,因为它们的大小不受限制(很容易意外添加2个以上的项目,而且最后需要验证大小)。此外,01的索引成为幻数并且在传达意义方面表现不佳("当我说0时,我的意思是head ...&#34 ;)

哈希也不合适,因为可能会意外添加额外的条目。

我编写了以下类来解决问题:

class Pair
  attr_accessor :head, :tail

  def initialize(h, t)
      @head, @tail = h, t
  end
end

它运行良好并解决了这个问题,但我很想知道:Ruby标准库是否已经提供了这样的类?

4 个答案:

答案 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_ato_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