Ruby Operators
Ruby supports a rich set of operators. Most operators are actually method calls. For example, a + b
is interpreted as a.+(b)
, where the +
method of the variable a
is called with b
as the argument.
For each operator (+ - * / % ** & | ^ << >> && ||
), there is a corresponding shorthand assignment operator (+= -=
etc.).
Ruby Arithmetic Operators
Assume variable a
holds 10 and variable b
holds 20, then:
Operator | Description | Example |
---|---|---|
+ | Addition - Adds operands on either side | a + b will give 30 |
- | Subtraction - Subtracts right operand from the left | a - b will give -10 |
* | Multiplication - Multiplies operands on either side | a * b will give 200 |
/ | Division - Divides left operand by right operand | b / a will give 2 |
% | Modulus - Divides left operand by right operand and returns remainder | b % a will give 0 |
** | Exponent - Performs exponential calculation | a**b will give 10 to the power 20 |
Ruby Comparison Operators
Assume variable a
holds 10 and variable b
holds 20, then:
Operator | Description | Example |
---|---|---|
== | Checks if the values of two operands are equal, if yes then condition is true. | (a == b) is not true. |
!= | Checks if the values of two operands are equal, if not then condition is true. | (a != b) is true. |
> | Checks if the value of the left operand is greater than the value of the right operand, if yes then condition is true. | (a > b) is not true. |
< | Checks if the value of the left operand is less than the value of the right operand, if yes then condition is true. | (a < b) is true. |
>= | Checks if the value of the left operand is greater than or equal to the value of the right operand, if yes then condition is true. | (a >= b) is not true. |
<= | Checks if the value of the left operand is less than or equal to the value of the right operand, if yes then condition is true. | (a <= b) is true. |
<=> | Combined comparison operator. Returns 0 if the first operand equals the second, 1 if the first operand is greater than the second, and -1 if the first operand is less than the second. | (a <=> b) returns -1. |
=== | Used to test equality within a when clause of a case statement. |
(1...10) === 5 returns true. |
.eql? | Returns true if the receiver and argument have both the same type and equal values. | 1 == 1.0 returns true, but 1.eql?(1.0) returns false. |
equal? | Returns true if the receiver and argument have the same object id. | If aObj is a copy of bObj , then aObj == bObj returns true, a.equal?bObj returns false, but a.equal?aObj returns true. |
Ruby Assignment Operators
Assume variable a
holds 10 and variable b
holds 20, then:
Operator | Description | Example |
---|---|---|
= | Simple assignment operator, assigns values from right side operands to left side operand | c = a + b will assign the value of a + b to c |
+= | Add AND assignment operator, adds the right operand to the left operand and assigns the result to the left operand | c += a is equivalent to c = c + a |
-= | Subtract AND assignment operator, subtracts the right operand from the left operand and assigns the result to the left operand | c -= a is equivalent to c = c - a |
*= | Multiply AND assignment operator, multiplies the right operand with the left operand and assigns the result to the left operand | c *= a is equivalent to c = c * a |
/= | Divide AND assignment operator, divides the left operand with the right operand and assigns the result to the left operand | c /= a is equivalent to c = c / a |
%= | Modulus AND assignment operator, takes modulus using two operands and assigns the result to the left operand | c %= a is equivalent to c = c % a |
**= | Exponent AND assignment operator, performs exponential calculation on operators and assigns value to the left operand | c **= a is equivalent to c = c ** a |
Ruby Parallel Assignment
Ruby also supports parallel assignment of variables. This allows multiple variables to be initialized with a single line of Ruby code. For example:
a = 10
b = 20
c = 30
Using parallel assignment, this can be done more quickly:
a, b, c = 10, 20, 30
Parallel assignment is also useful for swapping the values of two variables:
a, b = b, c
Ruby Bitwise Operators
Bitwise operators work on bits and perform bit-by-bit operations.
Assume if a = 60
, and b = 13
, now in binary format, they will be as follows:
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
The following table lists the bitwise operators supported by Ruby:
Operator | Description | Example |
---|---|---|
& | Binary AND Operator copies a bit to the result if it exists in both operands. | (a & b) will give 12, which is 0000 1100 |
| | Binary OR Operator copies a bit if it exists in either operand. | (a | b) will give 61, which is 0011 1101 |
^ | Binary XOR Operator copies the bit if it is set in one operand but not both. | (a ^ b) will give 49, which is 0011 0001 |
~ | Binary Ones Complement Operator is unary and has the effect of 'flipping' bits. | (~a) will give -61, which is 1100 0011 in 2's complement form due to a signed binary number. |
<< | Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand. | a << 2 will give 240, which is 1111 0000 |
>> | Binary Right Shift Operator. The left operands value is moved right by the number of bits specified by the right operand. | a >> 2 will give 15, which is 0000 1111 |
Ruby Logical Operators
The following table lists the logical operators supported by Ruby:
Assume variable a
holds 10 and variable b
holds 20, then:
Operator | Description | Example |
---|---|---|
and | Called Logical AND operator. If both the operands are true, then the condition is true. | (a and b) is true. |
or | Called Logical OR Operator. If any of the two operands are non-zero, then the condition is true. | (a or b) is true. |
&& | Called Logical AND operator. If both the operands are non-zero, then the condition is true. | (a && b) is true. |
|| | Called Logical OR Operator. If any of the two operands are non-zero, then the condition is true. | (a || b) is true. |
! | Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true, then Logical NOT operator will make it false. | !(a && b) is false. |
not | Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true, then Logical NOT operator will make it false. | not(a && b) is false. |
Ruby Ternary Operator
There is one more operator called the ternary operator. The first evaluates an expression for a true or false value and then executes one of the two given statements depending upon the result of the evaluation. The syntax is as follows:
Operator | Description | Example |
---|---|---|
? : | Conditional Expression | If the condition is true ? then X : otherwise Y |
Ruby Range Operators
In Ruby, sequence ranges are used to create a range of successive values - consisting of a start value, an end value (optionally), and values in between.
In Ruby, these sequences are created using the ".." and "..." range operators. The two-dot form creates an inclusive range, while the three-dot form creates a range that excludes the high value.
Operator | Description | Example |
---|---|---|
.. | Creates a range from the start point to the end point (inclusive) | 1..10 creates a range from 1 to 10 |
... | Creates a range from the start point to the end point (exclusive) | 1...10 creates a range from 1 to 9 |
Ruby defined? Operator
defined?
is a special operator that takes the form of a method call to determine whether the passed expression is defined. It returns a description string of the expression, or nil
if the expression is not defined.
Here are the various uses of the defined?
operator:
Usage 1
defined? variable # True if the variable is initialized
For example:
foo = 42
defined? foo # => "local-variable"
defined? $_ # => "global-variable"
defined? bar # => nil (undefined)
Usage 2
defined? method_call # True if the method is defined
For example:
defined? puts # => "method"
defined? puts(bar) # => nil (bar is undefined here)
defined? unpack # => nil (undefined here)
Usage 3
# True if a method callable by super user is present
defined? super
For example:
defined? super # => "super" (if callable)
defined? super # => nil (if not callable)
Usage 4
defined? yield # True if a block is passed
For example:
defined? yield # => "yield" (if a block is passed)
defined? yield # => nil (if no block is passed)
Ruby Dot Operator "." and Double Colon Operator "::"
You can call methods in a class or module by prefixing the method name with the class or module name and a dot .
. You can reference constants using the class or module name and two colons ::
.
::
is a unary operator that allows constants, instance methods, and class methods to be accessed from anywhere outside the class or module.
Remember: In Ruby, classes and methods can also be treated as constants.
You just need to prefix the constant name with ::
to return the appropriate class or module object.
If the expression before ::
is a class or module name, it returns the corresponding constant value within that class or module; if there is no prefix expression, it returns the corresponding constant value from the main Object class.
Here are two examples:
MR_COUNT = 0 # Defined on main Object class
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # Set global count to 1
MR_COUNT = 2 # Set local count to 2
end
puts MR_COUNT # This is the global constant
puts Foo::MR_COUNT # This is the local "Foo" constant
Second example:
CONST = ' out there'
class Inside_one
CONST = proc {' in there'}
def where_is_my_CONST
::CONST + ' inside one'
end
end
class Inside_two
CONST = ' inside two'
def where_is_my_CONST
CONST
end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST
Ruby Operator Precedence
The table below lists all the operators in order of precedence from highest to lowest.
Method | Operator | Description | |||
---|---|---|---|---|---|
Yes | :: | Constant resolution operator | |||
Yes | [ ] [ ]= | Element reference, element set | |||
Yes | ** | Exponentiation | |||
Yes | ! ~ + - | Not, complement, unary plus, unary minus (the last two methods are named +@ and -@) | |||
Yes | * / % | Multiplication, division, modulus | |||
Yes | + - | Addition and subtraction | |||
Yes | >> << | Bitwise shift right, bitwise shift left | |||
Yes | & | Bitwise AND | |||
Yes | ^ | | Bitwise XOR, bitwise OR | |||
Yes | <= < > >= | Comparison operators | |||
Yes | <=> == === != =~ !~ | Equality and pattern matching operators ( != and !~ cannot be defined as methods) | |||
&& | Logical AND | ||||
Logical OR | |||||
.. ... | Range (inclusive, exclusive) | ||||
? : | Ternary if-then-else | ||||
= %= { /= -= += | = &= >>= <<= *= &&= | = **= | Assignment | ||
defined? | Check if the specified symbol is defined | ||||
not | Logical negation | ||||
or and | Logical composition |
Note: Operators marked as Yes in the method column are actually methods and can therefore be overloaded.