Операторы
В 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–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.