Symbol objects represent named identifiers 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 #=> 2514190 $f2.object_id #=> 2514190 $f3.object_id #=> 2514190
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 # => [:Two] One.instance_methods(true) # => [:three] One.instance_variables # => [:@four] One.class_variables # => [:@@five] global_variables.grep(/six/) # => [:$six] local_variables # => [:seven]
Symbol objects are different from String objects in that Symbol objects represent identifiers, while String objects represent 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.
empty?
Returns true if self.length is zero; false otherwise.
end_with?
Returns true if symbol ends with any of the given strings.
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.
swapcase
Returns symbol with all upcase characters downcased and all downcase characters upcased.
upcase
Returns symbol with all characters upcased.
Returns an array of all the symbols currently in Ruby's symbol table.
Symbol.all_symbols.size #=> 903
Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink,
:chown, :EOFError, :$;, :String,
:LOCK_SH, :"setuid?", :$<,
:default_proc, :compact, :extend,
:Tms, :getwd, :$=, :ThreadGroup,
:wait2, :$>]
static VALUE
sym_all_symbols(VALUE _)
{
return rb_sym_all_symbols();
}
Compares symbol with other_symbol after calling to_s on each of the symbols. Returns -1, 0, +1, or nil depending on whether symbol is less than, equal to, or greater than other_symbol.
nil is returned if the two values are incomparable.
See String#<=> for more information.
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));
}
Equality—If sym and obj are exactly the same symbol, returns true.
#define sym_equal rb_obj_equal
Equality—If sym and obj are exactly the same symbol, returns true.
#define sym_equal rb_obj_equal
Returns sym.to_s =~ obj.
static VALUE
sym_match(VALUE sym, VALUE other)
{
return rb_str_match(rb_sym2str(sym), other);
}
Returns sym.to_s[].
static VALUE
sym_aref(int argc, VALUE *argv, VALUE sym)
{
return rb_str_aref_m(argc, argv, rb_sym2str(sym));
}
# File golf_prelude.rb, line 125
def call(*args, &block)
proc do |recv|
recv.__send__(self, *args, &block)
end
end
Equivalent to sym.to_s.capitalize.to_sym.
See String#capitalize.
static VALUE
sym_capitalize(int argc, VALUE *argv, VALUE sym)
{
return rb_str_intern(rb_str_capitalize(argc, argv, rb_sym2str(sym)));
}
Case-insensitive version of Symbol#<=>:
:aBcDeF.casecmp(:abcde) # => 1 :aBcDeF.casecmp(:abcdef) # => 0 :aBcDeF.casecmp(:abcdefg) # => -1 :abcdef.casecmp(:ABCDEF) # => 0
Returns nil if the two symbols have incompatible encodings, or if other_symbol is not a symbol:
sym = "\u{e4 f6 fc}".encode("ISO-8859-1").to_sym other_sym = :"\u{c4 d6 dc}" sym.casecmp(other_sym) # => nil :foo.casecmp(2) # => nil
Currently, case-insensitivity only works on characters A-Z/a-z, not all of Unicode. This is different from Symbol#casecmp?.
Related: Symbol#casecmp?.
static VALUE
sym_casecmp(VALUE sym, VALUE other)
{
if (!SYMBOL_P(other)) {
return Qnil;
}
return str_casecmp(rb_sym2str(sym), rb_sym2str(other));
}
Returns true if sym and other_symbol are equal after Unicode case folding, false if they are not equal:
:aBcDeF.casecmp?(:abcde) # => false :aBcDeF.casecmp?(:abcdef) # => true :aBcDeF.casecmp?(:abcdefg) # => false :abcdef.casecmp?(:ABCDEF) # => true :"\u{e4 f6 fc}".casecmp?(:"\u{c4 d6 dc}") #=> true
Returns nil if the two symbols have incompatible encodings, or if other_symbol is not a symbol:
sym = "\u{e4 f6 fc}".encode("ISO-8859-1").to_sym other_sym = :"\u{c4 d6 dc}" sym.casecmp?(other_sym) # => nil :foo.casecmp?(2) # => nil
See Case Mapping.
Related: Symbol#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));
}
Equivalent to sym.to_s.downcase.to_sym.
See String#downcase.
Related: Symbol#upcase.
static VALUE
sym_downcase(int argc, VALUE *argv, VALUE sym)
{
return rb_str_intern(rb_str_downcase(argc, argv, rb_sym2str(sym)));
}
Returns whether sym is :“” or not.
static VALUE
sym_empty(VALUE sym)
{
return rb_str_empty(rb_sym2str(sym));
}
Returns the Encoding object that represents the encoding of sym.
static VALUE
sym_encoding(VALUE sym)
{
return rb_obj_encoding(rb_sym2str(sym));
}
Returns true if sym ends with one of the suffixes given.
:hello.end_with?("ello") #=> true # returns true if one of the +suffixes+ matches. :hello.end_with?("heaven", "ello") #=> true :hello.end_with?("heaven", "paradise") #=> false
static VALUE
sym_end_with(int argc, VALUE *argv, VALUE sym)
{
return rb_str_end_with(argc, argv, rb_sym2str(sym));
}
Returns the name or string corresponding to sym.
:fred.id2name #=> "fred" :ginger.to_s #=> "ginger"
Note that this string is not frozen (unlike the symbol itself). To get a frozen string, use name.
VALUE
rb_sym_to_s(VALUE sym)
{
return str_new_shared(rb_cString, rb_sym2str(sym));
}
Returns the representation of sym as a symbol literal.
:fred.inspect #=> ":fred"
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);
RSTRING_GETMEM(str, ptr, len);
str = rb_enc_str_new(0, len + 1, enc);
dest = RSTRING_PTR(str);
memcpy(dest + 1, ptr, len);
}
dest[0] = ':';
return str;
}
In general, to_sym returns the Symbol corresponding to an object. As sym is already a symbol, self is returned in this case.
static VALUE
sym_to_sym(VALUE sym)
{
return sym;
}
Same as sym.to_s.length.
static VALUE
sym_length(VALUE sym)
{
return rb_str_length(rb_sym2str(sym));
}
Returns sym.to_s.match.
static VALUE
sym_match_m(int argc, VALUE *argv, VALUE sym)
{
return rb_str_match_m(argc, argv, rb_sym2str(sym));
}
Returns sym.to_s.match?.
static VALUE
sym_match_m_p(int argc, VALUE *argv, VALUE sym)
{
return rb_str_match_m_p(argc, argv, sym);
}
Returns the name or string corresponding to sym. Unlike to_s, the returned string is frozen.
:fred.name #=> "fred" :fred.name.frozen? #=> true :fred.to_s #=> "fred" :fred.to_s.frozen? #=> false
VALUE
rb_sym2str(VALUE sym)
{
}
Same as sym.to_s.succ.intern.
static VALUE
sym_succ(VALUE sym)
{
return rb_str_intern(rb_str_succ(rb_sym2str(sym)));
}
Same as sym.to_s.length.
static VALUE
sym_length(VALUE sym)
{
return rb_str_length(rb_sym2str(sym));
}
Returns sym.to_s[].
static VALUE
sym_aref(int argc, VALUE *argv, VALUE sym)
{
return rb_str_aref_m(argc, argv, rb_sym2str(sym));
}
Returns true if sym starts with one of the prefixes given. Each of the prefixes should be a String or a Regexp.
:hello.start_with?("hell") #=> true :hello.start_with?(/H/i) #=> true # returns true if one of the prefixes matches. :hello.start_with?("heaven", "hell") #=> true :hello.start_with?("heaven", "paradise") #=> false
static VALUE
sym_start_with(int argc, VALUE *argv, VALUE sym)
{
return rb_str_start_with(argc, argv, rb_sym2str(sym));
}
Same as sym.to_s.succ.intern.
static VALUE
sym_succ(VALUE sym)
{
return rb_str_intern(rb_str_succ(rb_sym2str(sym)));
}
Equivalent to sym.to_s.swapcase.to_sym.
See String#swapcase.
static VALUE
sym_swapcase(int argc, VALUE *argv, VALUE sym)
{
return rb_str_intern(rb_str_swapcase(argc, argv, rb_sym2str(sym)));
}
Returns a Proc object which responds to the given method by sym.
(1..3).collect(&:to_s) #=> ["1", "2", "3"]
VALUE
rb_sym_to_proc(VALUE sym)
{
}
Returns the name or string corresponding to sym.
:fred.id2name #=> "fred" :ginger.to_s #=> "ginger"
Note that this string is not frozen (unlike the symbol itself). To get a frozen string, use name.
VALUE
rb_sym_to_s(VALUE sym)
{
return str_new_shared(rb_cString, rb_sym2str(sym));
}
In general, to_sym returns the Symbol corresponding to an object. As sym is already a symbol, self is returned in this case.
static VALUE
sym_to_sym(VALUE sym)
{
return sym;
}
Equivalent to sym.to_s.upcase.to_sym.
See String#upcase.
static VALUE
sym_upcase(int argc, VALUE *argv, VALUE sym)
{
return rb_str_intern(rb_str_upcase(argc, argv, rb_sym2str(sym)));
}