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