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"


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow