To tylko hipotetyczne pytanie, jeśli nie miałbyś klasy Array
i Hash
, czy byłby jakiś sposób implementacji klasy Array w czystej Ruby? W jaki sposób?Czy tablica może zostać odkryta na nowo w Ruby?
Odpowiedz
Tak, możemy!
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]
ten polega na tworzeniu instancji zmiennych @ a0 @ a1 itp od obiektu, który reprezentuje indeksu tablicy 0, 1, itp ma długość i indeksu czynności stała czasowa. Reszta operacji (usunięcie itp.) Wymaga nieco więcej wysiłku, ale jest to absolutnie możliwe.
Należy zauważyć, że stała właściwość czasu dla operacji indeksu zależy od podstawowego środowiska wykonawczego Ruby, wykorzystującego odpowiednią strukturę danych dla zmiennych instancji.
Możesz użyć połączonej listy, która byłaby horrendalnie nieefektywna, ale możliwa. Możesz również użyć drzewa binarnego (zobacz powyższe komentarze).
Chyba moim celem jest: nie można uzyskać porządnej tablicy bez obsługi języków niższego poziomu. Podstawową strukturą, którą zakładam w tablicy Ruby jest tablica C (choć mógłbym się mylić). Przy tak podstawowym typie wsparcie na niższym poziomie będzie miało kluczowe znaczenie dla godnej wydajności.
Nie myślałem o tym. Interesujące :) – Geo
Możesz zaimplementować [] w dowolnym obiekcie. Na przykład:
def [](index)
proxy_object.send(index.to_sym)
end
Wiem, że miałem na myśli tablicę per se. – Geo
Pewnie, że możesz. Ruby jest językiem pełnym Turinga. Możesz zaimplementować wszystko, co, które możesz zaimplementować w języku w języku Ruby w wersji.
- 1. Czy tablica JavaScript może się sama zawierać?
- 2. Czy $ _SERVER ['REMOTE_USER'] może zostać sfałszowany?
- 3. Czy wyjście bash -v może zostać przekierowane?
- 4. Czy skompresowany javascript może zostać zdekompresowany?
- 5. Ruby: tablica rodzaju skrótów, mimo że klucz może nie istnieć
- 6. Czy zakres urządzeń pytestów może zostać nadpisany?
- 7. Czy narzędzie ChannelFactory może zostać zaatakowane?
- 8. Czy tablica PHP musi zostać zadeklarowana przed użyciem?
- 9. Czy plik wojenny może zostać wdrożony na dowolnym serwerze?
- 10. org.json.JSONObject nie może zostać przekonwertowany na JSONArray
- 11. Czy tablica może być za duża?
- 12. Tablica sortowania ruby tablicy
- 13. Tablica wyjściowa do CSV w Ruby
- 14. Czy AppFabric może zostać wdrożony w systemie Windows 7?
- 15. Czy obiekt datetime.date bez dnia może zostać utworzony w pythonie?
- 16. Czy klasa odniesienia może zostać przekształcona w wywołanie logu
- 17. tablica partycji za pomocą indeksu w Ruby
- 18. setLatestEventInfo nie może zostać rozwiązany
- 19. Tablica ruby do indeksowanego skrótu?
- 20. import nie może zostać rozwiązany
- 21. Ruby rozpakować tablica do blokowania
- 22. Czy faza "Aktualizacji biblioteki Androida" może zostać przyspieszona?
- 23. Czy JRuby może używać oryginalnych kamieni Ruby?
- 24. linux dlopen: czy biblioteka może zostać "powiadomiona" po załadowaniu?
- 25. Czy pamięć użyta przez MKMapView może zostać zwolniona?
- 26. Czy gwarantowane UB może zostać odrzucone podczas kompilacji?
- 27. Czy domyślny limit czasu blokady Oracle obiektu może zostać zmieniony?
- 28. Czy przesłane zdjęcie może zostać załadowane bezpośrednio przez cv2?
- 29. Czy zasięg dziecięcy $ może zostać zastosowany bez zastosowania elementu macierzystego?
- 30. Czy to zapytanie SQLite może zostać wykonane znacznie szybciej?
Myślę, że to najbardziej rubinowe rozwiązanie. – Geo