Quelqu'un utilise-t-il des tuples dans Ruby? Si oui, comment peut-on implémenter un tuple? Ruby sont agréables et fonctionnent presque aussi bien, mais j'aimerais vraiment voir quelque chose comme la classe Tuple en Python, où vous pouvez utiliser .
notation pour trouver la valeur recherchée. Je le veux pour pouvoir créer une implémentation de D , similaire à Dee pour Python.
Bref exemple:
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
Basé sur le fait que vous parlez de hachages et. notation, je vais supposer que vous voulez dire un type de Tuple différent du (1. "a")
Trier. Vous recherchez probablement la classe Struct
. par exemple:
Person = Struct.new(:name, :age)
me = Person.new
me.name = "Guy"
me.age = 30
Bien que ce ne soit pas strictement un tuple (ne peut pas faire de notation par points des membres), vous pouvez attribuer une liste de variables à partir d'une liste, ce qui résoudra souvent les problèmes avec Ruby étant passé -value lorsque vous recherchez une liste de valeurs de retour.
Par exemple.
:linenum > (a,b,c) = [1,2,3]
:linenum > a
=> 1
:linenum > b
=> 2
:linenum > c
=> 3
Je suis l'auteur de Gem for Ruby tuples .
Vous disposez de deux classes:
Tuple
en généralPair
en particulierVous pouvez les initialiser de différentes manières:
Tuple.new(1, 2)
Tuple.new([1, 2])
Tuple(1, 2)
Tuple([1, 2])
Tuple[1, 2]
Les deux classes ont des méthodes auxiliaires:
length
/arity
- qui retourne le nombre de valeurs dans Tuplefirst
/last
/second
(seule paire) - qui renvoie un élément correspondant[]
qui vous donne accès à un élément particulierVous pouvez vous moquer des tuples Scala avec cette astuce:
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"
mais ici vous ne pouvez pas avoir de déstructuration:
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
Mais grâce à cette astuce: https://Gist.github.com/stevecj/9ace6a70370f6d1a1511 la déstructuration fonctionnera:
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"
Vous pouvez faire quelque chose de similaire avec la déstructuration:
def something((a, b))
a + b
end
p something([1, 2])
Imprimez 3
Comme prévu.