web-dev-qa-db-ja.com

Rubyでタプルを使用していますか?

Rubyでタプルを使用する人はいますか?もしそうなら、どのようにしてタプルを実装できますか? Rubyハッシュはニースであり、ほぼ同じように機能しますが、PythonのTupleクラスのようなものを見てみたいです。そこでは_._表記を使用してPythonの Dee に似た [〜#〜] d [〜#〜] の実装を作成できるように、これが必要です。

58
user29439

OpenStruct

簡単な例:

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
46
Iraimbilanja

あなたがハッシュとについて話すという事実に基づいて。表記法(1. "a")ソートとは異なる種類のタプルを意味すると仮定します。おそらくStructクラスを探しています。例えば:

Person = Struct.new(:name, :age)
me = Person.new
me.name = "Guy"
me.age =  30
27
Logan Capaldo

これは厳密にはタプルではありませんが(メンバーのドット表記はできません)、リストから変数のリストを割り当てることができます。これにより、多くの場合、Ruby -valueは、戻り値のリストの後です。

例えば。

:linenum > (a,b,c) = [1,2,3]
:linenum > a
  => 1
:linenum > b
  => 2
:linenum > c
  => 3
13
e_m0ney

私は 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(ペアのみ)-対応する要素を返します
  • []特定の要素へのアクセスを提供します
8
Kamil Lelonek

このトリックで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"
5
Jules Ivanic

破壊に似たことができます:

def something((a, b))
  a + b
end

p something([1, 2])

これは、期待どおり3を出力します。

3
KARASZI István