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:
classFoo<Stringdef+(str)self.concat(str).concat("another string")endendfoobar =Foo.new("test ")putsfoobar+"baz "
This prints:
testbazanotherstring
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, andor) 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")#=> falseputsa#=> 1putsb#=> falseputsc#=> 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"#=> 3false||nil||"string"#=> "string"