Spec-Zone.ru › Ruby 3.3

Операторы

В 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API