Szukaj…


Składnia

  • :symbol
  • :'symbol'
  • :"symbol"
  • „symbol” .to_sym
  • % s {symbol}

Uwagi

Zalety używania symboli nad ciągami:

1. Symbol Ruby to obiekt z porównaniem O (1)

Aby porównać dwa ciągi, potencjalnie musimy spojrzeć na każdą postać. W przypadku dwóch łańcuchów o długości N będzie to wymagało porównań N + 1

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"

Ale ponieważ każdy wygląd: foobar odnosi się do tego samego obiektu, możemy porównywać symbole, patrząc na identyfikatory obiektów. Możemy to zrobić za pomocą jednego porównania. (O (1))

def symbol_compare sym1, sym2
  sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar

2. Rubinowy symbol jest etykietą w swobodnym wyliczeniu

W C ++ możemy używać „wyliczeń” do reprezentowania rodzin stałych pokrewnych:

enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status  = CLOSED;

Ponieważ jednak Ruby jest językiem dynamicznym, nie martwimy się o zadeklarowanie typu BugStatus lub śledzenie wartości prawnych. Zamiast tego reprezentujemy wartości wyliczenia jako symbole:

original_status = :open
current_status  = :closed

3. Rubinowy symbol to stała, unikalna nazwa

W Ruby możemy zmienić zawartość ciągu:

"foobar"[0] = ?b # "boo"

Ale nie możemy zmienić zawartości symbolu:

:foobar[0]  = ?b # Raises an error

4. Rubinowy symbol jest słowem kluczowym dla argumentu słowa kluczowego

Przy przekazywaniu argumentów słów kluczowych do funkcji Ruby określamy słowa kluczowe za pomocą symboli:

# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
        :action => 'show',
        :id => bug.id

5. Rubinowy symbol jest doskonałym wyborem dla klucza skrótu

Zazwyczaj używamy symboli do przedstawienia kluczy tabeli mieszającej:

options = {}
options[:auto_save]     = true
options[:show_comments] = false

Tworzenie symbolu

Najczęstszym sposobem utworzenia obiektu Symbol jest poprzedzenie identyfikatora ciągu dwukropkiem:

:a_symbol       # => :a_symbol
:a_symbol.class # => Symbol

Oto kilka alternatywnych sposobów definiują Symbol , w połączeniu z String dosłownym:

:"a_symbol"
"a_symbol".to_sym

Symbole mają również sekwencję %s , która obsługuje dowolne ograniczniki podobne do działania %q i %Q dla łańcuchów:

%s(a_symbol)
%s{a_symbol}

%s jest szczególnie użyteczny do utworzenia symbolu z danych wejściowych zawierających białe znaki:

%s{a symbol} # => :"a symbol"

Chociaż niektóre interesujące symbole ( :/ :[] :^ itp.) Można utworzyć z określonymi identyfikatorami łańcuchowymi, należy pamiętać, że symboli nie można utworzyć za pomocą identyfikatora numerycznego:

:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...

Symbole mogą kończyć się pojedynczym ? lub ! bez potrzeby używania literału ciągu jako identyfikatora symbolu:

:hello?  # :"hello?" is not necessary.
:world!  # :"world!" is not necessary.

Zauważ, że wszystkie te różne metody tworzenia symboli zwrócą ten sam obiekt:

:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id

Od Ruby 2.0 istnieje skrót do tworzenia tablicy symboli ze słów:

%i(numerator denominator) == [:numerator, :denominator]

Konwertowanie łańcucha na symbol

Biorąc pod uwagę String :

s = "something"

istnieje kilka sposobów przekonwertowania go na Symbol :

s.to_sym
# => :something
:"#{s}"
# => :something

Konwertowanie symbolu na ciąg

Biorąc pod uwagę Symbol :

s = :something

Najprostszym sposobem przekonwertowania go na String Symbol#to_s jest użycie metody Symbol#to_s :

s.to_s
# => "something"

Innym sposobem na to jest użycie metody Symbol#id2name , która jest aliasem dla metody Symbol#to_s . Ale jest to metoda unikalna dla klasy Symbol :

s.id2name
# => "something"


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow