Rubyでタプルを使用する人はいますか?もしそうなら、どのようにしてタプルを実装できますか? Rubyハッシュはニースであり、ほぼ同じように機能しますが、PythonのTupleクラスのようなものを見てみたいです。そこでは_.
_表記を使用してPythonの Dee に似た [〜#〜] d [〜#〜] の実装を作成できるように、これが必要です。
簡単な例:
require 'ostruct'
person = OpenStruct.new
person.name = "John Smith"
person.age = 70
person.pension = 300
puts person.name # -> "John Smith"
puts person.age # -> 70
puts person.address # -> nil
あなたがハッシュとについて話すという事実に基づいて。表記法(1. "a")
ソートとは異なる種類のタプルを意味すると仮定します。おそらくStruct
クラスを探しています。例えば:
Person = Struct.new(:name, :age)
me = Person.new
me.name = "Guy"
me.age = 30
これは厳密にはタプルではありませんが(メンバーのドット表記はできません)、リストから変数のリストを割り当てることができます。これにより、多くの場合、Ruby -valueは、戻り値のリストの後です。
例えば。
:linenum > (a,b,c) = [1,2,3]
:linenum > a
=> 1
:linenum > b
=> 2
:linenum > c
=> 3
私は Gem for Ruby tuples の著者です。
次の2つのクラスが提供されます。
Tuple
全般Pair
特にそれらはさまざまな方法で初期化できます。
Tuple.new(1, 2)
Tuple.new([1, 2])
Tuple(1, 2)
Tuple([1, 2])
Tuple[1, 2]
両方のクラスには、いくつかの補助メソッドがあります。
length
/arity
-タプル内の値の数を返しますfirst
/last
/second
(ペアのみ)-対応する要素を返します[]
特定の要素へのアクセスを提供しますこのトリックでScalaタプルをモックできます:
Tuple = Struct.new(:_1, :_2)
2.2.5 :003 > t = Tuple.new("a", "b")
=> #<struct Tuple _1="a", _2="b">
2.2.5 :004 > t._1
=> "a"
2.2.5 :005 > t._2
=> "b"
しかし、ここでは破壊することはできません:
2.2.5 :012 > a, b = t
=> {:_1=>"a", :_2=>"b"}
2.2.5 :013 > a
=> {:_1=>"a", :_2=>"b"}
2.2.5 :014 > b
=> nil
しかし、このトリックのおかげで: https://Gist.github.com/stevecj/9ace6a70370f6d1a1511 破壊は機能します:
2.2.5 :001 > Tuple = Struct.new(:_1, :_2)
=> Tuple
2.2.5 :002 > t = Tuple.new("a", "b")
=> #<struct Tuple _1="a", _2="b">
2.2.5 :003 > t._1
=> "a"
2.2.5 :004 > class Tuple ; def to_ary ; to_a ; end ; end
=> :to_ary
2.2.5 :005 > a, b = t
=> #<struct Tuple _1="a", _2="b">
2.2.5 :006 > a
=> "a"
2.2.5 :007 > b
=> "b"
破壊に似たことができます:
def something((a, b))
a + b
end
p something([1, 2])
これは、期待どおり3
を出力します。