Ceci est juste une question hypothétique, si vous n'auriez pas le Array
et la classe Hash
, y aurait-il un moyen d'implémenter une classe Array en Ruby pur? Comment?Le tableau peut-il être réinventé dans Ruby?
Répondre
Oui, nous pouvons!
class MyArray
include Enumerable
def initialize
@size = 0
end
def <<(val)
instance_variable_set("@a#{@size}".to_sym, val)
@size += 1
end
def [](n)
instance_variable_get("@a#{n}")
end
def length
@size
end
def each
0.upto(@size - 1) { |n| yield self[n] }
end
end
a = MyArray.new
a << 1
a << 2
p a.to_a #=> [1,2]
Cela fonctionne en créant des variables d'instance @ a0, a1 @, etc. sur l'objet pour représenter les indices de tableau 0, 1, etc. Il a une longueur constante de temps et les opérations index. Le reste des opérations (suppression, etc.) est un peu plus d'effort à mettre en œuvre, mais c'est tout à fait possible.
Notez que la propriété de durée constante pour l'opération d'index dépend du moteur d'exécution Ruby sous-jacent utilisant une structure de données appropriée pour les variables d'instance.
Vous pourriez utiliser une liste chaînée, ce qui serait horriblement inefficace, mais possible. Vous pouvez également utiliser un arbre binaire (voir les commentaires ci-dessus). Je suppose, mon point est: vous ne pourriez pas obtenir un tableau décent sans support de langue de niveau inférieur. La structure de base que je suppose est utilisée dans le tableau Ruby est un tableau C (bien que je puisse me tromper). Avec un tel type fondamental, le soutien de niveau inférieur sera crucial pour n'importe quelle performance décente.
N'a pas pensé à ça. Intéressant :) – Geo
Vous pouvez implémenter [] dans n'importe quel objet. Par exemple:
def [](index)
proxy_object.send(index.to_sym)
end
Je sais que, je parlais d'un tableau en soi. – Geo
Bien sûr, vous pouvez. Ruby est un langage de Turing-complet. Vous pouvez implémenter tout que vous pouvez implémenter en n'importe quel langage dans Ruby.
- 1. Trier et valeurs magasin de tableau multidimensionnel dans le nouveau tableau dans Ruby
- 2. Comment découper un tableau dans Ruby
- 3. Comment fusionner des sous-tableaux dans un tableau dans Ruby?
- 4. Comment convertir un tableau ruby en tableau C avec RubyInline?
- 5. Ruby: comment puis-je copier ce tableau?
- 6. Les opérateurs Ruby peuvent-ils être aliasés?
- 7. Trier un tableau d'objets dans Ruby par l'attribut d'objet?
- 8. Sortie de tableau Javascript dans le tableau
- 9. Réorganisation du tableau Ruby en hachage
- 10. Comment passer tableau en php à ruby?
- 11. cartographie complexe de tableau pour objet Ruby
- 12. Tri d'un tableau de tableaux en Ruby
- 13. Comment générer un tableau de distances par paires dans Ruby?
- 14. Comment obtenir un tableau de noms de tables dans ruby
- 15. Conversion d'un tableau de clés et un tableau de valeurs dans un hachage en Ruby
- 16. Convertir un tableau d'entiers en un tableau de chaînes dans Ruby?
- 17. Modification de la variable set à array find_all semble modifier le tableau original dans Ruby
- 18. Ruby ajoute un élément de hachage au tableau dans le contrôleur
- 19. itinéraires personnalisés Ruby dans le modèle
- 20. Affirmer le dernier enregistrement dans le tableau
- 21. Lire le fichier dans le tableau
- 22. Comment le démon Ruby
- 23. Remplacer la chaîne dans le tableau javascript
- 24. Sortie de tableau Javascript dans le tableau aligné
- 25. Tableau Java: accès direct au composant dans le tableau
- 26. Représentation de tableau dans le schéma
- 27. L'application Ruby on Rails n'a pas pu être démarrée
- 28. Pointeurs de méthode dans Ruby
- 29. Comment faites-vous le polymorphisme dans Ruby?
- 30. tester le code fileté dans ruby
Je pense que c'est la solution la plus ruby-esque. – Geo