Frage

Hat jemand Tupeln in Ruby verwenden? Wenn ja, wie kann man ein Tupel implementieren? Ruby-Hashes sind nett und arbeiten fast so gut, aber ich möchte wirklich so etwas wie die Tuple-Klasse in Python sehen, wo Sie . Notation verwenden, um den Wert zu finden, für die Sie suchen. Ich will das so, dass ich eine Implementierung von D ähnlich Dee für Python.

War es hilfreich?

Lösung

OpenStruct ?

Kurz Beispiel:

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

Andere Tipps

Basierend auf der Tatsache, dass Sie über Hashes sprechen und. Notation Ich werde dir eine andere Art von Tupel als die (1. "a") Art bedeuten, zu übernehmen. Sie suchen wahrscheinlich für die Struct Klasse. zB:

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

Dies ist zwar nicht unbedingt ein Tupel (keine Punktnotation der Mitglieder tun), können Sie eine Liste von Variablen aus einer Liste zuweisen können, die Probleme lösen wird oft mit Rubin sein Pass-by-Wert, wenn Sie nach sind eine Liste der Rückgabewerte.

z.

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

Ich bin der Autor von Gem für Ruby Tupeln .

Sie sind mit zwei Klassen zur Verfügung gestellt:

  • Tuple im allgemeinen
  • Pair insbesondere

Sie können sie auf unterschiedliche Weise initialisieren:

Tuple.new(1, 2)
Tuple.new([1, 2])
Tuple(1, 2)
Tuple([1, 2])
Tuple[1, 2]

Beide Klassen haben einige Hilfsmethoden:

  • length / arity - die Anzahl der Werte innerhalb Tupel zurück
  • first / last / second (nur pair) -, die ein entsprechenden Elemente
  • kehrt
  • [], dass Sie einen Zugriff auf eine bestimmte Elemente
  • gibt

können Sie verspotten die Scala Tupel mit diesem Trick:

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"

aber hier kann man nicht Destrukturierung haben:

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

Aber dank dieser Trick: https://gist.github.com/stevecj/9ace6a70370f6d1a1511 Destrukturierung funktioniert:

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"

Sie können mit Destrukturierung etwas similiar tun:

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

p something([1, 2])

Dies gibt 3 wie erwartet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top