Ruby Language
Symbolen
Zoeken…
Syntaxis
- :symbool
- :'symbool'
- :"symbool"
- "Symbool" .to_sym
- % S {symbol}
Opmerkingen
Voordelen van het gebruik van symbolen boven tekenreeksen:
1. Een Ruby-symbool is een object met O (1) vergelijking
Om twee strings te vergelijken, moeten we mogelijk naar elk personage kijken. Voor twee reeksen van lengte N vereist dit N + 1-vergelijkingen
def string_compare str1, str2
if str1.length != str2.length
return false
end
for i in 0...str1.length
return false if str1[i] != str2[i]
end
return true
end
string_compare "foobar", "foobar"
Maar aangezien elke verschijning van: foobar naar hetzelfde object verwijst, kunnen we symbolen vergelijken door naar object-ID's te kijken. We kunnen dit doen met een enkele vergelijking. (O (1))
def symbol_compare sym1, sym2
sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar
2. Een Ruby-symbool is een label in een vrije opsomming
In C ++ kunnen we "opsommingen" gebruiken om families van gerelateerde constanten weer te geven:
enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status = CLOSED;
Maar omdat Ruby een dynamische taal is, maken we ons geen zorgen over het aangeven van een BugStatus-type of het bijhouden van de wettelijke waarden. In plaats daarvan stellen we de opsommingswaarden voor als symbolen:
original_status = :open
current_status = :closed
3. Een Ruby-symbool is een constante, unieke naam
In Ruby kunnen we de inhoud van een string wijzigen:
"foobar"[0] = ?b # "boo"
Maar we kunnen de inhoud van een symbool niet wijzigen:
:foobar[0] = ?b # Raises an error
4. Een Ruby-symbool is het sleutelwoord voor een trefwoordargument
Bij het doorgeven van trefwoordargumenten aan een Ruby-functie, specificeren we de trefwoorden met behulp van symbolen:
# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
:action => 'show',
:id => bug.id
5. Een Ruby-symbool is een uitstekende keuze voor een hash-toets
Meestal gebruiken we symbolen om de sleutels van een hashtabel weer te geven:
options = {}
options[:auto_save] = true
options[:show_comments] = false
Een symbool maken
De meest voorkomende manier om het creëren van een Symbol
object is door het voorvoegsel de string identifier met een dubbele punt:
:a_symbol # => :a_symbol
:a_symbol.class # => Symbol
Hier zijn enkele alternatieve manieren om een Symbol
te definiëren, in combinatie met een letterlijke String
:
:"a_symbol"
"a_symbol".to_sym
Symbolen hebben ook een %s
reeks die willekeurige scheidingstekens ondersteunt, vergelijkbaar met hoe %q
en %Q
werken voor tekenreeksen:
%s(a_symbol)
%s{a_symbol}
De %s
is met name handig om een symbool te maken van een invoer die witruimte bevat:
%s{a symbol} # => :"a symbol"
Hoewel sommige interessante symbolen ( :/
:[]
:^
, enz.) Kunnen worden gemaakt met bepaalde tekenreeks-id's, moet u er rekening mee houden dat symbolen niet kunnen worden gemaakt met een numerieke id:
:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...
Symbolen kunnen eindigen met een enkele ?
of !
zonder een letterlijke tekenreeks te gebruiken als identificatie van het symbool:
:hello? # :"hello?" is not necessary.
:world! # :"world!" is not necessary.
Merk op dat al deze verschillende methoden voor het maken van symbolen hetzelfde object retourneren:
:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id
Sinds Ruby 2.0 is er een snelkoppeling voor het maken van een reeks symbolen uit woorden:
%i(numerator denominator) == [:numerator, :denominator]
Een string omzetten in symbool
Gegeven een String
:
s = "something"
er zijn verschillende manieren om het om te zetten in een Symbol
:
s.to_sym
# => :something
:"#{s}"
# => :something
Een symbool converteren naar tekenreeks
Gegeven een Symbol
:
s = :something
De eenvoudigste manier om het te converteren naar een String
is met de methode Symbol#to_s
:
s.to_s
# => "something"
Een andere manier om dit te doen is door de methode Symbol#id2name
gebruiken. Dit is een alias voor de methode Symbol#to_s
. Maar het is een methode die uniek is voor de klasse Symbol
:
s.id2name
# => "something"