If you wish to report errors or suggest improvements for this FAQ, please go to our GitHub repository and open an issue or pull request.
Syntax
What is the difference between an immediate value and a reference?
This section or parts of it might be out-dated or in need of confirmation.
Fixnum
, true
, nil
, and false
are implemented as immediate values.
With immediate values, variables hold the objects themselves, rather than
references to them.
Singleton methods cannot be defined for such objects. Two Fixnums
of the
same value always represent the same object instance, so (for example)
instance variables for the Fixnum
with the value 1
are shared between
all the 1
’s in the system. This makes it impossible to define a singleton
method for just one of these.
What is the difference between nil
and false
?
First the similarity: nil
and false
are the only two objects
that evaluate to false
in a boolean context.
(In other words: they are the only “falsy” values, all other
objects are “truthy”.)
However, nil
and false
are instances of different classes
(NilClass
and FalseClass
), and have different behavior elsewhere.
We recommend that predicate methods (those whose name ends with a question
mark) return true
or false
. Other methods that need to indicate failure
should return nil
.
Why is an empty string not false
?
Q: An empty string (""
) returns true
in a conditional expression!
In Perl, it’s false
.
A: But Ruby is not Perl ;-). It’s very simple: in Ruby, only nil
and false
are false in conditional contexts.
You can use empty?
, compare the string to ""
, or compare the string’s
size
or length
to 0
to find out if a string is empty.
What does :name
mean?
A colon followed by a name generates a Symbol object which corresponds
one to one with the identifier. During the duration of a program’s
execution the same Symbol object will be created for a given name or string.
Symbols can also be created with "name".intern
or "name".to_sym
.
Symbol objects can represent identifiers for methods, variables, and so on.
Some methods, like define_method
, method_missing
, or trace_var
,
require a symbol. Other methods, e.g. attr_accessor
, send
, or autoload
,
also accept a string.
Due to the fact that they are created only once, Symbols are often used as hash keys. String hash keys would create a new object for every single use, thereby causing some memory overhead. There is even a special syntax for symbol hash keys:
person_1 = { :name => "John", :age => 42 }
person_2 = { name: "Jane", age: 24 } # alternate syntax
Symbols can also be used as enumeration values or to assign unique values to constants:
status = :open # :closed, ...
NORTH = :NORTH
SOUTH = :SOUTH
How can I access the value of a symbol?
To get the value of the variable corresponding to a symbol, you can use
symbol.to_s
or "#{symbol}"
to get the name of the variable, and then
eval that in the scope of the symbol to get the variable’s contents:
a = "This is the content of `a'"
b = eval("#{:a}")
a.object_id == b.object_id # => true
You can also use
b = binding.local_variable_get(:a)
If your symbol corresponds to the name of a method, you can use send
:
class Demo
def hello
"Hello, world"
end
end
demo = Demo.new
demo.send(:hello)
Or you can use Object#method
to return a corresponding Method
object,
which you may then call:
m = demo.method(:hello) # => #<Method: Demo#hello>
m.call # => "Hello, world"
Is loop
a control structure?
Although loop
looks like a control structure, it is actually a method
defined in Kernel
. The block which follows introduces a new scope for
local variables.
Ruby doesn’t have a post-test loop
Q: Ruby does not have a do { ... } while
construct, so how can I implement
loops that test the condition at the end?
Clemens Hintze says: You can use a combination of Ruby’s begin ... end
and the while
or until
statement modifiers to achieve the same effect:
i = 0
begin
puts "i = #{i}"
i += 1
end until i > 4
Produces:
i = 0
i = 1
i = 2
i = 3
i = 4
Why can’t I pass a hash literal to a method: p {}
?
The {}
is parsed as a block, not a Hash
constructor. You can force the
{}
to be treated as an expression by making the fact that it’s a parameter
explicit: p({})
.
I can’t get def pos=(val)
to work!
I have the following code, but I cannot use the method pos = 1
.
def pos=(val)
@pos = val
puts @pos
end
Methods with =
appended must be called with an explicit receiver
(without the receiver, you are just assigning to a local variable).
Invoke it as self.pos = 1
.
What is the difference between '\1'
and '\\1'
?
They have the same meaning. In a single quoted string, only \'
and \\
are transformed and other combinations remain unchanged.
However, in a double quoted string, "\1"
is the byte \001
(an octal bit pattern), while "\\1"
is the two character string
containing a backslash and the character "1"
.
What is the difference between ..
and ...
?
..
includes the right hand side in the range, ...
does not:
(5..8).to_a # => [5, 6, 7, 8]
(5...8).to_a # => [5, 6, 7]
What is the difference between or
and ||
?
Q: p(nil || "Hello")
prints "Hello"
, while p(nil or "Hello")
gives a
parse error. Why?
A: or
has a very low precedence, p( (nil or "Hello") )
will work.
The precedence of or
is for instance also lower than that of =
,
whereas ||
has a higher precedence:
foo = nil || "Hello" # parsed as: foo = (nil || "Hello")
foo # => "Hello"
# but perhaps surprisingly:
foo = nil or "Hello" # parsed as: (foo = nil) or "Hello"
foo # => nil
or
(and similarly and
) is best used not for combining
boolean expressions, but for control flow, like in
do_something or raise "some error!"
where do_something
returns false
or nil
when an error occurs.
Does Ruby have function pointers?
A Proc
object generated by Proc.new
, proc
, or lambda
can be referenced
from a variable, so that variable could be said to be a function pointer. You
can also get references to methods within a particular object instance using
object.method
.
What is the difference between load
and require
?
load
will load and execute a Ruby program (*.rb
).
require
loads Ruby programs as well, but will also load binary Ruby
extension modules (shared libraries or DLLs). In addition,
require
ensures that a feature is never loaded more than once.
Does Ruby have exception handling?
Ruby supports a flexible exception handling scheme:
begin
statements which may raise exceptions
rescue [exception class names]
statements when an exception occurred
rescue [exception class names]
statements when an exception occurred
ensure
statements that will always run
end
If an exception occurs in the begin
clause, the rescue
clause with the
matching exception name is executed. The ensure
clause is executed whether
an exception occurred or not. rescue
and ensure
clauses may be omitted.
If no exception class is designated for a rescue
clause, StandardError
exception is implied, and exceptions which are in a is_a?
relation to
StandardError
are captured.
This expression returns the value of the begin
clause.
The latest exception is accessed by the global variable $!
(and so its type can be determined using $!.type
).