Ich sah, dass object_id
von Strings immer anders ist, während Symbole object_id
das gleiche ist (wenn der Wert gleich ist). Wie ich verstehe, ist der Unterschied zwischen Symbolen und Strings Unveränderlichkeit und Leistung. Können wir nicht einfach einen String in einer Variablen speichern und einfrieren?Symbole (Speichern von Strings in Variablen vs Symbole)
Antwort
[...] können wir nicht einfach einen String in einer Variablen speichern und einfrieren?
Fast, aktuelle Versionen von Ruby können gefrorene Strings optimieren:
'foo'.freeze.object_id #=> 70313275108080
'foo'.freeze.object_id #=> 70313275108080
Aber diese Optimierung ist begrenzt. Es funktioniert für String Literale (wie oben dargestellt), aber es funktioniert nicht, wenn die Zeichenfolge später gefroren ist:
a = 'foo'
a.freeze
a.object_id #=> 70313275335500
b = 'foo'
b.freeze
b.object_id #=> 70313275274260
Sofern Sie die frozen_string_literal
Funktion aktivieren:
# frozen_string_literal: true
puts 'foo'.object_id
puts 'foo'.object_id
Ausgang:
$ ruby test.rb
70185151269500
70185151269500
Oder von der Kommandozeile:
$ ruby --enable-frozen-string-literal -e "puts 'foo'.object_id, 'foo'.object_id"
70102955495340
70102955495340
freeze
verhindert die Änderung des tatsächlichen Objekts, jedoch sind Variablen Verweise auf Objekte, so dass Sie die Referenz noch ändern können. Das Folgende ist zum Beispiel vollkommen gültig.
a = "foo"
a.freeze
a = "boo"
Am Ende dieser a
ist gleich "boo".
In Ruby-Versionen 2.1 und älter ein Symbol ist eine verfügbare object_id
zugeordnet und zu jeder Zeit die gleiche Symbol-ID verwendet wird die gleiche object_id wird immer verwendet werden; Dies ist nie Müll gesammelt. Dies ist unveränderbar, aber es ist auch effizienter (weniger Speicheraufwand).
In Ruby-Versionen 2.2 und höher ist das Verhalten im Grunde das gleiche, außer Symbole können Müll gesammelt werden. Der Grund für diese Änderung war, einen Symbol-DoS-Angriff zu verhindern.
Wo also Strings und wo Symbole dann verwenden? –
Vielen Dank für Ihre Antwort! Ich werde über Symbol DoS-Angriff lesen :) –
- 1. Uninteressierte Symbole Symbole
- 2. Split-Strings durch zwei verschiedene Symbole
- 3. Warum verwenden nicht mehr Projekte Ruby-Symbole anstelle von Strings?
- 4. PHP entfernen Symbole von String
- 5. Math Symbole in vim
- 6. Symbole in DataGridView
- 7. Benutzeroberfläche Symbole
- 8. Wann ich Strings oder Symbole in CLIPS verwenden soll
- 9. Symbole in restructuredText
- 10. Position Symbole in Kreis
- 11. Symbole in Haskell
- 12. Fehlende Symbole in QTabWidget
- 13. Plotten Symbole schlägt in PDF
- 14. Hat C# vordefinierte Symbole?
- 15. Was bedeuten grafische Symbole und Symbole in Android Studio?
- 16. Die Symbole von kernel32 erhalten
- 17. Wie kann ich Symbole in einer Zeile von VB
- 18. Ändern von registrierten Symbole (R)
- 19. WPF: Verschwinden Symbole
- 20. Android: Wie Navigation Navigationsschublade Symbole mit font-awesome Symbole ersetzen (Symbole verfügbar)
- 21. Mehrere Symbole von einer Installation?
- 22. Debug Core-Datei ohne Symbole
- 23. Schriftart Awesome Symbole Konflikt mit jQuery UI-Symbole
- 24. ld meldet fehlende Symbole, aber Symbole scheinen zu existieren
- 25. Ankreuzfelder QPushButton Funktionen Makeln (anhängen Strings + benutzerdefinierte Symbole zeigen)
- 26. Hashes und Symbole
- 27. Doppelte Symbole in der Anwendungsliste
- 28. was die Graviszeichen Symbole in vs Benutzermodus-Debugger sind
- 29. Warum ignorieren Suchmaschinen Symbole?
- 30. Aufräumen Magento Modman symbole
Also wo Strings zu verwenden und wo Symbole dann zu verwenden? –
@ RamziddinMakhmudov Verwenden Sie eine Zeichenfolge, wenn ihr Inhalt wichtig ist, d. H. Die Zeichen. Wenn Sie einen Bezeichner oder ein Label benötigen, verwenden Sie ein Symbol. – Stefan
Danke für die saubere und verständliche Antwort =) –