2017-05-19 1 views
2

So weit ich verstehe, sind Symbole Möglichkeiten, den Speicherbedarf von Strings zu reduzieren. So sollte in allen Fällen :firefox"firefox" entsprechen.In Ruby, Symbole, die nicht durch Strings ersetzt werden können?

In einigen der Selenbindungen scheint dies jedoch nicht zu gelten.

https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings

driver = Selenium::WebDriver.for :remote, desired_capabilities: :firefox 

Wenn ich :firefox mit "firefox" in diesem Anruf ersetzen, erhalte ich einen Fehler. Ist das Symbol hier eigentlich etwas mehr als ein etwas mehr Speicher effizienter String?

Antwort

3

String s und Symbol s in Ruby ist nie direkt gleich. Der Unterschied in der Klasse ist wichtig, in mehr als einer Weise, und

:my_label != "my_label" 

jedoch

:my_label.to_s == "my_label" 

Ein Ruby Symbol ist effizienter als ein String in ein paar Möglichkeiten, einschließlich:

  • A Symbol Hashes und vergleicht schneller, was bei der Verwendung als Hash-Schlüssel hilft.

  • Mehrere Verwendungen der gleichen Symbol machen keine Kopien der internen Daten, sondern sind nur identische Zeiger auf das gleiche Objekt im Speicher. Dies macht sie speichereffizient, wenn Sie viel mit dem gleichen Wert haben.

Wenn eine Bibliothek, wie Selenium::WebDriver Verwendung eines Symbol als Parameter macht, dann kann man nicht immer ersetzen Sie es mit einem äquivalenten String. Ob Sie es so behandeln können, hängt von der jeweiligen Bibliothek ab. Es ist relativ einfach zu Symbol s zu String s und umgekehrt umzuwandeln, so dass viele Bibliotheken diese Besetzung für Sie tun werden. Es ist sehr üblich, Bibliothekscode zu haben, der param = param.to_s tut, wenn er einen String Parameter benötigt.Umwandlung beliebige String Werte in äquivalent Symbol diejenigen, war ein Weg, um Speicherlecks (und ein -

String-Symbol Casting weniger häufig in der Bibliothek Code, weil für einen langen und Ruby nicht Garbage sammeln unreferenced Symbol Objekte gefunden Vektor für einen Angreifer, um Ihr Programm zu stürzen).

2

Symbol ist ein Datentyp.

Selenium::WebDriver.for Methode akzeptiert Argumente und erwartet wahrscheinlich, dass die Hash-Werte Symbole sind. Ich habe nie mit der Klasse gearbeitet und weiß nicht, ob das letzte Argument zu for ein Hash oder Kwargs ist, aber Sie haben die Idee: Datentyp ist.

Wenn Sie den falschen Datentyp übergeben, wird der Fehler ausgelöst.

+1

Einige Bibliotheken bemühen sich beide zu akzeptieren, aber ja, es ist überhaupt nicht automatisch. Rails verwöhnt Leute :) –

+2

'4' ist nicht das selbe wie' 4.0' ist nicht das selbe wie '' 4'' ist nicht dasselbe wie ':" 4 "' ist nicht dasselbe wie '[4]' nicht das Gleiche wie ... – Phrogz

0

Um den Unterschied zwischen einem String und einem Symbol zu sehen, die folgenden irb Transkript sehen:

irb(main):007:0> "firefox" 
=> "firefox" 
irb(main):008:0> "firefox".to_sym 
=> :firefox 
irb(main):009:0> "firefox".class 
=> String 
irb(main):010:0> "firefox".to_sym.class 
=> Symbol 
Verwandte Themen