Operators¶ ↑
In Ruby, operators such as +
, are defined as methods on the class. Literals define their methods within the lower level, C language. String
class, for example.
Ruby objects can define or overload their own implementation for most operators.
Here is an example:
class Foo < String def +(str) self.concat(str).concat("another string") end end foobar = Foo.new("test ") puts foobar + "baz "
This prints:
test baz another string
What operators are available is dependent on the implementing class.
Operator Behavior¶ ↑
How a class behaves to a given operator is specific to that class, since operators are method implementations.
When using an operator, it’s the expression on the left-hand side of the operation that specifies the behavior.
'a' * 3 #=> "aaa" 3 * 'a' # TypeError: String can't be coerced into Integer
Logical Operators¶ ↑
Logical operators are not methods, and therefore cannot be redefined/overloaded. They are tokenized at a lower level.
Short-circuit logical operators (&&
, ||
, and
, and or
) do not always result in a boolean value. Similar to blocks, it’s the last evaluated expression that defines the result of the operation.
&&
, and
¶ ↑
Both &&
/and
operators provide short-circuiting by executing each side of the operator, left to right, and stopping at the first occurrence of a falsey expression. The expression that defines the result is the last one executed, whether it be the final expression, or the first occurrence of a falsey expression.
Some examples:
true && 9 && "string" #=> "string" (1 + 2) && nil && "string" #=> nil (a = 1) && (b = false) && (c = "string") #=> false puts a #=> 1 puts b #=> false puts c #=> nil
In this last example, c
was initialized, but not defined.
||
, or
¶ ↑
The means by which ||
/or
short-circuits, is to return the result of the first expression that is truthy.
Some examples:
(1 + 2) || true || "string" #=> 3 false || nil || "string" #=> "string"