Unter Verwendung von Tupeln in Ruby?
-
22-08-2019 - |
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.
Lösung
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.