A Symbol
object represents a named identifier inside the Ruby interpreter.
You can create a Symbol
object explicitly with:
The same Symbol
object will be created for a given name or string for the duration of a programâs execution, regardless of the context or meaning of that name. Thus if Fred
is a constant in one context, a method in another, and a class in a third, the Symbol
:Fred
will be the same object in all three contexts.
module One class Fred end $f1 = :Fred end module Two Fred = 1 $f2 = :Fred end def Fred() end $f3 = :Fred $f1.object_id $f2.object_id $f3.object_id
Constant, method, and variable names are returned as symbols:
module One Two = 2 def three; 3 end @four = 4 @@five = 5 $six = 6 end seven = 7 One.constants One.instance_methods(true) One.instance_variables One.class_variables global_variables.grep(/six/) local_variables
A Symbol
object differs from a String
object in that a Symbol
object represents an identifier, while a String
object represents text or data.
First, whatâs elsewhere. Class Symbol
:
Inherits from class Object.
Includes module Comparable.
Here, class Symbol
provides methods that are useful for:
::all_symbols
: Returns an array of the symbols currently in Rubyâs symbol table.
=~
: Returns the index of the first substring in symbol that matches a given Regexp
or other object; returns nil
if no match is found.
[]
, slice
: Returns a substring of symbol determined by a given index, start/length, or range, or string.
empty?
: Returns true
if self.length
is zero; false
otherwise.
encoding
: Returns the Encoding
object that represents the encoding of symbol.
end_with?
: Returns true
if symbol ends with any of the given strings.
match
: Returns a MatchData
object if symbol matches a given Regexp
; nil
otherwise.
match?
: Returns true
if symbol matches a given Regexp
; false
otherwise.
start_with?
: Returns true
if symbol starts with any of the given strings.
<=>
: Returns -1, 0, or 1 as a given symbol is smaller than, equal to, or larger than symbol.
==
, ===
: Returns true
if a given symbol has the same content and encoding.
casecmp
: Ignoring case, returns -1, 0, or 1 as a given symbol is smaller than, equal to, or larger than symbol.
casecmp?
: Returns true
if symbol is equal to a given symbol after Unicode case folding; false
otherwise.
capitalize
: Returns symbol with the first character upcased and all other characters downcased.
downcase
: Returns symbol with all characters downcased.
inspect
: Returns the string representation of self
as a symbol literal.
name
: Returns the frozen string corresponding to symbol.
succ
, next
: Returns the symbol that is the successor to symbol.
swapcase
: Returns symbol with all upcase characters downcased and all downcase characters upcased.
to_proc
: Returns a Proc
object which responds to the method named by symbol.
upcase
: Returns symbol with all characters upcased.
static VALUE sym_all_symbols(VALUE _) { return rb_sym_all_symbols(); }
Returns an array of all symbols currently in Rubyâs symbol table:
Symbol.all_symbols.size Symbol.all_symbols.take(3)Source
def self.json_create(o) o['s'].to_sym end
See as_json
.
static VALUE sym_cmp(VALUE sym, VALUE other) { if (!SYMBOL_P(other)) { return Qnil; } return rb_str_cmp_m(rb_sym2str(sym), rb_sym2str(other)); }
If object
is a symbol, returns the equivalent of symbol.to_s <=> object.to_s
:
:bar <=> :foo :foo <=> :foo :foo <=> :bar
Otherwise, returns nil
:
:foo <=> 'bar'
Related: String#<=>
.
#define sym_equal rb_obj_equal
Returns true
if object
is the same object as self
, false
otherwise.
static VALUE sym_match(VALUE sym, VALUE other) { return rb_str_match(rb_sym2str(sym), other); }
Equivalent to symbol.to_s =~ object
, including possible updates to global variables; see String#=~
.
static VALUE sym_aref(int argc, VALUE *argv, VALUE sym) { return rb_str_aref_m(argc, argv, rb_sym2str(sym)); }
Equivalent to symbol.to_s[]
; see String#[]
.
def as_json(*) { JSON.create_id => self.class.name, 's' => to_s, } end
Methods Symbol#as_json
and Symbol.json_create
may be used to serialize and deserialize a Symbol object; see Marshal
.
Method Symbol#as_json
serializes self
, returning a 2-element hash representing self
:
require 'json/add/symbol' x = :foo.as_json
Method JSON.create
deserializes such a hash, returning a Symbol object:
Symbol.json_create(x)Source
static VALUE sym_capitalize(int argc, VALUE *argv, VALUE sym) { return rb_str_intern(rb_str_capitalize(argc, argv, rb_sym2str(sym))); }
Equivalent to sym.to_s.capitalize.to_sym
.
See String#capitalize
.
static VALUE sym_casecmp(VALUE sym, VALUE other) { if (!SYMBOL_P(other)) { return Qnil; } return str_casecmp(rb_sym2str(sym), rb_sym2str(other)); }
Like Symbol#<=>
, but case-insensitive; equivalent to self.to_s.casecmp(object.to_s)
:
lower = :abc upper = :ABC upper.casecmp(lower) lower.casecmp(lower) lower.casecmp(upper)
Returns nil if self
and object
have incompatible encodings, or if object
is not a symbol:
sym = 'äöü'.encode("ISO-8859-1").to_sym other_sym = 'ÃÃÃ' sym.casecmp(other_sym) :foo.casecmp(2)
Unlike Symbol#casecmp?
, case-insensitivity does not work for characters outside of âAâ..âZâ and âaâ..âzâ:
lower = :äöü upper = :ÃÃà upper.casecmp(lower) lower.casecmp(lower) lower.casecmp(upper)
Related: Symbol#casecmp?
, String#casecmp
.
static VALUE sym_casecmp_p(VALUE sym, VALUE other) { if (!SYMBOL_P(other)) { return Qnil; } return str_casecmp_p(rb_sym2str(sym), rb_sym2str(other)); }
Returns true
if self
and object
are equal after Unicode case folding, otherwise false
:
lower = :abc upper = :ABC upper.casecmp?(lower) lower.casecmp?(lower) lower.casecmp?(upper)
Returns nil if self
and object
have incompatible encodings, or if object
is not a symbol:
sym = 'äöü'.encode("ISO-8859-1").to_sym other_sym = 'ÃÃÃ' sym.casecmp?(other_sym) :foo.casecmp?(2)
Unlike Symbol#casecmp
, works for characters outside of âAâ..âZâ and âaâ..âzâ:
lower = :äöü upper = :ÃÃà upper.casecmp?(lower) lower.casecmp?(lower) lower.casecmp?(upper)
Related: Symbol#casecmp
, String#casecmp?
.
static VALUE sym_downcase(int argc, VALUE *argv, VALUE sym) { return rb_str_intern(rb_str_downcase(argc, argv, rb_sym2str(sym))); }
Equivalent to sym.to_s.downcase.to_sym
.
See String#downcase
.
Related: Symbol#upcase
.
static VALUE sym_empty(VALUE sym) { return rb_str_empty(rb_sym2str(sym)); }
Returns true
if self
is :''
, false
otherwise.
static VALUE sym_encoding(VALUE sym) { return rb_obj_encoding(rb_sym2str(sym)); }
Equivalent to self.to_s.encoding
; see String#encoding
.
static VALUE sym_end_with(int argc, VALUE *argv, VALUE sym) { return rb_str_end_with(argc, argv, rb_sym2str(sym)); }
Equivalent to self.to_s.end_with?
; see String#end_with?
.
static VALUE sym_inspect(VALUE sym) { VALUE str = rb_sym2str(sym); const char *ptr; long len; char *dest; if (!rb_str_symname_p(str)) { str = rb_str_inspect(str); len = RSTRING_LEN(str); rb_str_resize(str, len + 1); dest = RSTRING_PTR(str); memmove(dest + 1, dest, len); } else { rb_encoding *enc = STR_ENC_GET(str); VALUE orig_str = str; len = RSTRING_LEN(orig_str); str = rb_enc_str_new(0, len + 1, enc); // Get data pointer after allocation ptr = RSTRING_PTR(orig_str); dest = RSTRING_PTR(str); memcpy(dest + 1, ptr, len); RB_GC_GUARD(orig_str); } dest[0] = ':'; RUBY_ASSERT_BUILTIN_TYPE(str, T_STRING); return str; }
Returns a string representation of self
(including the leading colon):
:foo.inspect
Related: Symbol#to_s
, Symbol#name
.
static VALUE sym_length(VALUE sym) { return rb_str_length(rb_sym2str(sym)); }
Equivalent to self.to_s.length
; see String#length
.
static VALUE sym_match_m(int argc, VALUE *argv, VALUE sym) { return rb_str_match_m(argc, argv, rb_sym2str(sym)); }
Equivalent to self.to_s.match
, including possible updates to global variables; see String#match
.
static VALUE sym_match_m_p(int argc, VALUE *argv, VALUE sym) { return rb_str_match_m_p(argc, argv, sym); }
Equivalent to sym.to_s.match?
; see String#match
.
def name Primitive.attr! :leaf Primitive.cexpr! 'rb_sym2str(self)' end
Returns a frozen string representation of self
(not including the leading colon):
:foo.name :foo.name.frozen?
Related: Symbol#to_s
, Symbol#inspect
.
Equivalent to self.to_s.succ.to_sym
:
:foo.succ
Related: String#succ
.
static VALUE sym_start_with(int argc, VALUE *argv, VALUE sym) { return rb_str_start_with(argc, argv, rb_sym2str(sym)); }
Equivalent to self.to_s.start_with?
; see String#start_with?
.
static VALUE sym_succ(VALUE sym) { return rb_str_intern(rb_str_succ(rb_sym2str(sym))); }
Equivalent to self.to_s.succ.to_sym
:
:foo.succ
Related: String#succ
.
static VALUE sym_swapcase(int argc, VALUE *argv, VALUE sym) { return rb_str_intern(rb_str_swapcase(argc, argv, rb_sym2str(sym))); }
Equivalent to sym.to_s.swapcase.to_sym
.
See String#swapcase
.
def to_json(state = nil, *a) state = ::JSON::State.from_state(state) if state.strict? super else as_json.to_json(state, *a) end end
Returns a JSON
string representing self
:
require 'json/add/symbol' puts :foo.to_json
Output:
Calls superclass method
SourceVALUE rb_sym_to_proc(VALUE sym) { enum {SYM_PROC_CACHE_SIZE = 67}; if (rb_ractor_main_p()) { if (!sym_proc_cache) { sym_proc_cache = rb_ary_hidden_new(SYM_PROC_CACHE_SIZE); rb_ary_store(sym_proc_cache, SYM_PROC_CACHE_SIZE - 1, Qnil); } ID id = SYM2ID(sym); long index = (id % SYM_PROC_CACHE_SIZE); VALUE procval = RARRAY_AREF(sym_proc_cache, index); if (RTEST(procval)) { rb_proc_t *proc; GetProcPtr(procval, proc); if (proc->block.as.symbol == sym) { return procval; } } procval = sym_proc_new(rb_cProc, sym); RARRAY_ASET(sym_proc_cache, index, procval); return RB_GC_GUARD(procval); } else { return sym_proc_new(rb_cProc, sym); } }
Returns a Proc
object which calls the method with name of self
on the first parameter and passes the remaining parameters to the method.
proc = :to_s.to_proc proc.call(1000) proc.call(1000, 16) (1..3).collect(&:to_s)Source
def to_s Primitive.attr! :leaf Primitive.cexpr! 'rb_sym_to_s(self)' end
Returns a string representation of self
(not including the leading colon):
:foo.to_s
Related: Symbol#inspect
, Symbol#name
.
static VALUE sym_upcase(int argc, VALUE *argv, VALUE sym) { return rb_str_intern(rb_str_upcase(argc, argv, rb_sym2str(sym))); }
Equivalent to sym.to_s.upcase.to_sym
.
See String#upcase
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4