Ruby Language
Symbolika
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"