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"


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow