web-dev-qa-db-fra.com

Utilisation de tuples en Ruby?

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.

58
user29439

OpenStruct ?

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

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
27
Logan Capaldo

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
13
e_m0ney

Je suis l'auteur de Gem for Ruby tuples .

Vous disposez de deux classes:

  • Tuple en général
  • Pair en particulier

Vous 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 Tuple
  • first/last/second (seule paire) - qui renvoie un élément correspondant
  • [] qui vous donne accès à un élément particulier
8
Kamil Lelonek

Vous 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"
5
Jules Ivanic

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.

3
KARASZI István