Ruby Language
symboler
Sök…
Syntax
- :symbol
- :'symbol'
- :"symbol"
- "Symbol" .to_sym
- % S {symbol}
Anmärkningar
Fördelar med att använda symboler över strängar:
1. En Ruby-symbol är ett objekt med O (1) jämförelse
För att jämföra två strängar måste vi potentiellt titta på varje karaktär. För två strängar med längd N kommer detta att kräva N + 1-jämförelser
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"
Men eftersom varje utseende på: foobar hänvisar till samma objekt kan vi jämföra symboler genom att titta på objekt-ID. Vi kan göra detta med en enda jämförelse. (O (1))
def symbol_compare sym1, sym2
sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar
2. En Ruby-symbol är en etikett i en fri uppräkning
I C ++ kan vi använda "uppräkningar" för att representera familjer med relaterade konstanter:
enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status = CLOSED;
Men eftersom Ruby är ett dynamiskt språk, oroar vi oss inte för att förklara en BugStatus-typ eller hålla reda på lagliga värden. Istället representerar vi uppräkningsvärdena som symboler:
original_status = :open
current_status = :closed
3. En Ruby-symbol är ett konstant, unikt namn
I Ruby kan vi ändra innehållet i en sträng:
"foobar"[0] = ?b # "boo"
Men vi kan inte ändra innehållet i en symbol:
:foobar[0] = ?b # Raises an error
4. En Ruby-symbol är nyckelordet för ett nyckelordargument
När vi överför nyckelordargument till en Ruby-funktion anger vi nyckelorden med symboler:
# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
:action => 'show',
:id => bug.id
5. En Ruby-symbol är ett utmärkt val för en hash-nyckel
Vanligtvis använder vi symboler för att representera nycklarna till en hashtabell:
options = {}
options[:auto_save] = true
options[:show_comments] = false
Skapa en symbol
Det vanligaste sättet att skapa ett Symbol
är genom att prefixera strängidentifieraren med en kolon:
:a_symbol # => :a_symbol
:a_symbol.class # => Symbol
Här är några alternativa sätt att definiera en Symbol
, i kombination med en String
bokstavlig:
:"a_symbol"
"a_symbol".to_sym
Symbolerna har också en %s
sekvens som stöder godtyckliga avgränsare som liknar hur %q
och %Q
fungerar för strängar:
%s(a_symbol)
%s{a_symbol}
%s
är särskilt användbart för att skapa en symbol från en ingång som innehåller vitt utrymme:
%s{a symbol} # => :"a symbol"
Medan vissa intressanta symboler ( :/
:[]
:^
, etc.) kan skapas med vissa strängidentifierare, observera att symboler inte kan skapas med en numerisk identifierare:
:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...
Symboler kan sluta med en enda ?
eller !
utan att behöva använda en strängbokstav som symbolens identifierare:
:hello? # :"hello?" is not necessary.
:world! # :"world!" is not necessary.
Observera att alla dessa olika metoder för att skapa symboler kommer att returnera samma objekt:
:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id
Sedan Ruby 2.0 finns det en genväg för att skapa en rad symboler från ord:
%i(numerator denominator) == [:numerator, :denominator]
Konvertera en sträng till symbol
Ges en String
:
s = "something"
Det finns flera sätt att konvertera till en Symbol
:
s.to_sym
# => :something
:"#{s}"
# => :something
Konvertera en symbol till sträng
Ges en Symbol
:
s = :something
Det enklaste sättet att konvertera det till en String
är att använda metoden Symbol#to_s
:
s.to_s
# => "something"
Ett annat sätt att göra det är att använda metoden Symbol#id2name
som är ett alias för metoden Symbol#to_s
. Men det är en metod som är unik för Symbol
:
s.id2name
# => "something"