2009-02-08 16 views
49

Verwendet jemand Tupel in Ruby? Wenn ja, wie kann man ein Tupel implementieren? Ruby-Hashes sind schön und funktionieren fast genauso gut, aber ich würde gerne etwas wie die Tuple-Klasse in Python sehen, wo Sie die .-Notation verwenden können, um den Wert zu finden, nach dem Sie suchen. Ich möchte das, damit ich eine Implementierung von D, ähnlich Dee für Python erstellen kann.Verwenden von Tupel in Ruby?

+0

Haben Sie jemals D in Ruby implementieren? Wenn ja, haben Sie den Link dazu? Ich habe kürzlich an etwas ähnlichem gearbeitet und würde gerne sehen, was Sie bisher gemacht haben. – dkubb

+1

Nein; Ich bin noch nie so weit gekommen. Ich habe mich durch verschiedene andere Dinge gekämpft, um wieder zurück zu kommen. Ich habe mehrere Bibliotheken gefunden, die scheinen, als ob sie helfen würden: LazyList und arel. Ich kam im Grunde zu dem Schluss, dass LINQ in .NET fast da war, dann fand sich arel, das auch nah war. Die Verwendung von LazyList und das Entfernen der Direkt-zu-SQL-Konvertierung, die ebenfalls ein Projektziel darstellt, würde Sie fast dorthin bringen. Das heißt, ich würde gerne sehen, was Sie bisher haben. Ich bin immer noch ein kleines Stück davon entfernt, darauf zurückzukommen. –

+0

Ehrgeiz ist eine andere interessant aussehende Bibliothek, aber es wurde seit einiger Zeit nicht aktualisiert. Das war die erste, die ich gefunden habe. arel sieht aus wie in der gleichen Tradition. –

Antwort

44

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 
+0

Das ist _exactly_ was ich gesucht habe. Vielen Dank! –

+2

np :) um deine Frage zu beantworten: nein ich benutze keine Tupel in Ruby, als Openstruct oder sonst. Ich benutze Klassen am oberen Ende und Hashes am unteren Ende :) –

+9

Dies ist eine schlechte Antwort, nur ein Link? Ernst? Was passiert, wenn die Verbindung unterbrochen wird? –

25

Basierend auf der Tatsache, dass Sie über Hashes sprechen und. Notation Ich gehe davon aus, dass Sie eine andere Art von Tupel als die (1. "a") Art bedeuten. Sie suchen wahrscheinlich nach der Struct Klasse. zB:

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

Das ist nahe, aber es zu benennen, nervt mich. Ich suchte nach etwas wie der (1. "a") Art, aber mit der Eigenschaft get/set Notation, die Sie beschreiben. –

+6

@panesofglass, es gibt keine Notwendigkeit, nichts zu nennen: a = Struct.new (: Name,: Alter) .new; a.name = "Guy" – paradoja

+0

Kann ich 'a = Struct.new (: name,: age)' setzen und später a.new sagen? Ich nehme es an. Ich muss das überprüfen. Es wäre viel expliziter, was ich will. –

9

Dies ist zwar nicht unbedingt ein Tupel (kann Punktnotation der Mitglieder nicht 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 einer Liste von Rückgabewerten suchen.

z.

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

Sie können mit Destrukturierung similiar etwas tun:

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

p something([1, 2]) 

Diese 3 ausdruckt, wie erwartet.

7

Ich bin der Autor von Gem for Ruby tuples.

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] 

der beiden Klassen haben einige Hilfsmethoden:

  • length/arity - die
  • Anzahl von Werten innerhalb Tupel gibt
  • first/last/second (nur Paar) - die ein entsprechenden Elemente zurück
  • [], dass Ihnen einen Zugriff auf ein bestimmtes Element
  • gibt
0

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

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 haben Destrukturierung:

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" 
Verwandte Themen