Ruby: с нуля – часть 4: операторы

ruby_logoПредыдущая часть – часть 3: переменные, константы и литералы.

Арифметрические операторы Ruby

Предположим, что переменная a == 10, а переменная b == 20.

Оператор

Описание

Пример

+

сложение

a + b вернет 30

-

вычитание

a – b вернет -10

*

умножение

a * b вернет 200

/

деление

b / a вернет 2

%

деление по модулю

b % a вернет 0

**

возведение в степень

a**b вернет 10 в степени 20

Операторы сравнения

Оператор

Описание

Пример

==

True, если значения двух операндов одинаковы.

(a == b) is not true.

!=

Trueесли значения двух операндов не одинаковы.

(a != b) is true.

>

Trueесли левый операнд больше правого.

(a > b) is not true.

<

Trueесли правый операнд больше левого.

(a < b) is true.

>=

Trueесли левый операнд больше или равен правому.

(a >= b) is not true.

<=

Trueесли левый операнд меньше или равен правому.

(a <= b) is true.

<=>

Комбинированный оператор сравнения. Возвращает 0, если операнд слева равен операнду справа, 1 – если операнд слева больше, и -1 – если он меньше.

(a <=> b) returns -1.

===

Used to test equality within a when clause of a case statement.

(1…10) === 5 returns true.

.eql?

True, если оба операнда имеют одно и то же значение и тип.

1 == 1.0 returns true, but 1.eql?(1.0) is false.

equal?

True, если оба операнда имеют один и тот же object id.

if aObj is duplicate of bObj then aObj == bObj is true, a.equal?bObj is false but a.equal?aObj is true.

Операторы присваивания

Оператор

Описание

Пример

=

Присваивает значение справа операнду слева.

c = a + b will assigne value of a + b into c

+=

Присваивает операнд справа операнду слева, и результат присваивает левому операнду.

c += a is equivalent to c = c + a

-=

Вычитает операнд справа от операнда слева, и результат присваивает левому операнду.

c -= a is equivalent to c = c – a

*=

Аналогично, с умножением.

c *= a is equivalent to c = c * a

/=

Аналогично, с делением.

c /= a is equivalent to c = c / a

%=

Аналогично, с делением по модулю.

c %= a is equivalent to c = c % a

**=

Аналогично, с с возведением в степень.

c **= a is equivalent to c = c ** a

Операторы параллельного присваивания

Ruby позволяет инициализировать несколько переменных в одну строк.

Например, код:

a = 10
b = 20
c = 30

можно записать в таком виде:

a, b, c = 10, 20, 30

Кроме того – таким образом можно присвоить значение одной переменной – другой:

a, b = b, c

Логические операторы Ruby

Оператор

Описание

Пример

and

Логический опратор “И” (AND). True, если оба значения равны.

(a and b) is true.

or

Логический опратор “ИЛИ” (OR). True, если одно из значений не ноль.

(a or b) is true.

&&

Логический опратор “И” (AND). True,  если оба операнда не ноль.

(a && b) is true.

||

Логический опратор “ИЛИ” (OR). True, если хотя бы один из операндов не ноль.

(a || b) is true.

!

Логический опратор “НЕТ” (NOT). Если выражение возвращает True – то оператор ! вернет False.

!(a && b) is false.

not

Аналогично.

not(a && b) is false.

Тернарный (условный) оператор в Ruby

В Ruby имеется специальный “тройной” (лат. ternarius — «тройной») оператор, который проверяет является ли условие истиной, а потом выполняет одно или два заданных действия, в зависимости от результата проверки.

Его синтаксис выглядит так:

Оператор

Описание

Пример

? :

условное выражение

Если выражение True, Тогда значение X: Иначе значение Y

Операторы диапазона

Операторы диапазона последовательностей (range operators) используются для создания последовательности значение.

В Ruby для этой цели имеются операторы “..” и “...“. При использовании “..” – в перечисление не будет включен последний элемент этой последовательности, а при использовании “...” – будет.

Оператор

Описание

Пример

..

Создает диапазон, включающий последнее значение

1..10 Creates a range from 1 to 10 inclusive

...

Создает диапазон, исключающий последнее значение

1…10 Creates a range from 1 to 9

Оператор defined?

defined? – специальный оператор в Ruby, который используется проверки переданного ему выражения.

Пример 1

defined? variable # True если переменная проиницилизирована
irb(main):001:0> foo = 42
=> 42
irb(main):002:0> defined? foo
=> "local-variable"
irb(main):003:0> defined? $_
=> "global-variable"
irb(main):004:0> defined? bar
=> nil

Пример 2

defined? method_call # True если метод существует
irb(main):005:0> defined? puts
=> "method"
irb(main):006:0> defined? puts(bar)
=> nil
irb(main):007:0> defined? unpack
=> nil

Ruby операторы “.” и “::”

Вы можете обратиться к методу модуля с помощью оператора “.“, а к константе – с помощью двойного двоеточия “::“.

::” является унарным оператором, который позволяет вызвать константу, метод инстанса или класса из другого модуля или класса.

Пример 1

#!/usr/bin/env ruby -w

MR_COUNT = 0        # определяем константу класса Object

module Foo
  MR_COUNT = 0
  ::MR_COUNT = 1    # меняем значение глобальной константы == 1
  MR_COUNT = 2      # меняем значение локальной константы == 1
end

puts "Global: #{MR_COUNT}"      # значение глобальной константы
puts "Lolcal: #{Foo::MR_COUNT}" # значение локальной константы

Результат:

$ ./dd.rb
./dd.rb:7: warning: already initialized constant MR_COUNT
./dd.rb:3: warning: previous definition of MR_COUNT was here
./dd.rb:8: warning: already initialized constant Foo::MR_COUNT
./dd.rb:6: warning: previous definition of MR_COUNT was here
Global: 1
Lolcal: 2

Пример 2

#!/usr/bin/env ruby

CONST = ' out there'

class Inside_one
   CONST = proc {' in there'}
   def where_is_my_CONST
      ::CONST + ' inside one'
   end
end

class Inside_two
   CONST = ' inside two'
   def where_is_my_CONST
      CONST
   end
end

puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST

Результат:

$ ./colon2.rb 
 out there inside one
 inside two
 out there inside two
 inside two out there
#<Proc:0x007f9be60aac38@./colon2.rb:6>
 in there inside two

Старшинство операторов в  Ruby

Список ниже приводит список всех операторов в порядке их старшинства:

Method

Оператор

Описание

Yes

::

Constant resolution operator

Yes

[ ] [ ]=

Element reference, element set

Yes

**

Exponentiation (raise to the power)

Yes

! ~ +

Not, complement, unary plus and minus (method names for the last two are +@ and -@)

Yes

* / %

Multiply, divide, and modulo

Yes

+ -

Addition and subtraction

Yes

>> <<

Right and left bitwise shift

Yes

&

Bitwise ‘AND’

Yes

^ |

Bitwise exclusive `OR’ and regular `OR’

Yes

<= < > >=

Comparison operators

Yes

<=> == === != =~ !~

Equality and pattern match operators (!= and !~ may not be defined as methods)

&&

Logical ‘AND’

||

Logical ‘OR’

.. ...

Range (inclusive and exclusive)

? :

Ternary if-then-else

= %= { /= -= += |= &= >>= <<= *= &&= ||= **=

Assignment

defined?

Check if specified symbol defined

not

Logical negation

or and

Logical composition

Операторы, для которых указан “Yes” в колонке “Method” являются методами, и могут быть переопределены.

Продолжение – часть 5: комментарии.