Esta es solo una pregunta hipotética, si no tuviera la clase Array
y Hash
, ¿habría alguna forma de implementar una clase Array en Ruby puro? ¿Cómo?¿Se puede reinventar la matriz en Ruby?
Respuesta
Sí, podemos!
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]
Esto funciona mediante la creación de variables de instancia @ a0, a1 @, etc. en el objeto para representar los índices de matriz 0, 1, etc. Tiene longitud y de índice de las operaciones de tiempo constante. El resto de las operaciones (eliminar, etc.) requieren un poco más de esfuerzo, pero es absolutamente posible.
Tenga en cuenta que la propiedad de tiempo constante para la operación de índice depende del tiempo de ejecución de Ruby subyacente utilizando una estructura de datos apropiada para las variables de instancia.
Puede usar una lista vinculada, lo que sería tremendamente ineficiente, pero posible. También podría usar un árbol binario (ver comentarios anteriores).
Supongo que mi punto es: no se puede obtener una matriz decente sin un soporte de idiomas de nivel inferior. La estructura básica que supongo que se usa en la matriz de Ruby es una matriz C (aunque podría estar equivocado). Con un tipo tan fundamental, el soporte de nivel inferior será crucial para un rendimiento decente en cualquier lugar.
No he pensado en eso. Interesante :) – Geo
Puede implementar [] en cualquier objeto. Por ejemplo:
def [](index)
proxy_object.send(index.to_sym)
end
Lo sé, me refería a una matriz per se. – Geo
Claro que sí. Ruby es un lenguaje completo de Turing. Puede implementar todo que puede implementar en cualquier idioma en Ruby.
- 1. No se puede deserializar la matriz
- 2. No se puede instalar Ruby en CentOS
- 3. php: no se puede modificar la matriz en la función?
- 4. No se puede instalar la gema ruby-debug en Windows
- 5. No se puede deserializar la matriz JSON en tipo - Json.NET
- 6. Espacio en la matriz de ruby% w
- 7. Ruby encuentra el siguiente en la matriz
- 8. Haskell: ¿Qué mónada acabo de reinventar?
- 9. Ruby no se puede usar requiere
- 10. acumulativa matriz suma en Ruby
- 11. ¿Cómo se ordena una matriz alfabéticamente utilizando sort_by en ruby?
- 12. No se puede cambiar la versión de Ruby con RVM
- 13. Eliminar matriz de claves en Ruby Hash
- 14. No se puede instalar la gema ruby-debug-base19x
- 15. ¿No se puede usar una matriz como valores predeterminados para Ruby Hash?
- 16. Eliminando elementos de la matriz Ruby
- 17. ¿Cuál es la 'manera de Ruby' para iterar en una matriz, desde la matriz [n] hasta la matriz [n - 1]?
- 18. matriz de Ruby each_slice_with_index?
- 19. no se puede ejecutar ffmpeg como subproceso en Ruby
- 20. ruby: ordena la matriz de símbolos
- 21. ¿Se puede describir esta relación en Ruby on Rails?
- 22. No se puede iniciar sesión en Amazon con Ruby Mechanize
- 23. ¿La matriz se intersecta en la tecla de la matriz?
- 24. sqlite3-ruby no se puede hacer en rvm 1.8.7
- 25. No se puede encontrar el rake en Ruby Rails Instalar
- 26. ¿Se puede usar punto y coma en Ruby?
- 27. Matriz de salida a CSV en Ruby
- 28. Ruby: ¿Cómo agrupar una matriz de Ruby?
- 29. ¿No se puede crear una matriz de LinkedLists en Java ...?
- 30. Crear o anexar a la matriz en Ruby
Creo que esta es la solución más estilo ruby. – Geo