Операторы
В Ruby операторы, такие как +, определены как методы класса. Литералы определяют свои методы на более низком уровне, языке C. String класс, например.
Объекты Ruby могут определить или перегрузить собственную реализацию для большинства операторов.
Вот пример:
class Foo < String
def +(str)
self.concat(str).concat("another string")
end
end
foobar = Foo.new("test ")
puts foobar + "baz "
Это выводит:
test baz another string
Какие операторы доступны, зависит от реализуемого класса.
Поведение операторов
То, как класс ведет себя с данным оператором, специфично для этого класса, так как операторы — это реализации методов.
При использовании оператора, поведение определяется выражением слева от операции.
'a' * 3 #=> "aaa" 3 * 'a' # TypeError: String can't be coerced into Integer
Логические операторы
Логические операторы не являются методами и поэтому не могут быть переопределены/перегружены. Они токенизируются на более низком уровне.
Короткие логические операторы (&&, ||, and, и or) не всегда приводят к булевому значению. Подобно блокам, последним вычисленным выражением определяется результат операции.
&&, and
Оба оператора &&/and обеспечивают короткое замыкание, выполняя каждую сторону оператора слева направо и останавливаясь при первом появлении ложно выражения. Выражение, определяющее результат, — это последнее выполненное выражение, будь то последнее выражение или первое ложное выражение.
Некоторые примеры:
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
В этом последнем примере c был инициализирован, но не определён.
||, or
Способ, которым ||/or выполняет короткое замыкание, заключается в возвращении результата первого выражения, которое является истинным.
Некоторые примеры:
(1 + 2) || true || "string" #=> 3 false || nil || "string" #=> "string"
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.