2017-02-07 6 views
3

場合によっては、キー/値のデータを処理する必要があります。Rubyは `Pair`データ型を持っていますか?

彼らはサイズに拘束されていないので、私は(それが誤って2つの以上の項目を追加するには余りにも簡単だ、プラスあなたが後でサイズを検証する必要が終わる)、配列を使用して嫌い。さらに、0とのインデックスはマジックナンバーになり、意味を伝えるのは難しいです(「私が0と言うとき、私は実際にはheadを意味します...」)。誤って余分なエントリを追加することが可能であるよう

ハッシュは、また、適切ではありません。

私はこの問題を解決するために以下のクラスを書いた:

class Pair 
    attr_accessor :head, :tail 

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

それは素晴らしい作品と問題は解決するが、私が知って好奇心:Rubyの標準ライブラリはすでにそのようなクラスが付属していますか?

+0

は私には、リンクされたリストのように見えます。それはあなたが伝えようとしている意味ですか? – fylooi

+0

@flyooi - いいえ、あなたが望むのであれば、おそらく私の実装でそれを行うことができます。 – Rick

+1

'Pair = Struct.new(:head、:tail)'は、このクラスを書くより短い方法です。 – steenslag

答えて

3

いいえ、Rubyのコアライブラリまたは標準ライブラリには、このようなクラスがありません。しかし、タプルのためのコアライブラリのサポート(リテラルシンタックス)もあります。

私は一度ペアでHash#eachによってyieldedを取得し、配列を置き換えるために、あなたに非常によく似たクラスで実験。私は猿パッチング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 
1

ます。またOpenStructデータ型を使用することができます。おそらくない、まさにあなたが望んでいたが、ここで実装したものです...

require 'ostruct' 

foo = OpenStruct.new 
foo.head = "cabeza" 
foo.tail = "cola" 

は最後に、

puts foo.head 
=> "cabeza" 

puts foo.tail 
=> "cola" 
関連する問題