SlideShare une entreprise Scribd logo
1  sur  59
Télécharger pour lire hors ligne
Ruby
Основы
Типы данных
Типы данных
Типы данных
                         Numeric

123             # экземпляр класса Fixnum
1000000000      # один миллиард
1_000_000_000   # один миллиард

0377            # восьмеричное представление числа 255
0b1111_1111     # двоичное представление числа 255
0xFF            # шестнадцатеричное представление числа 255

0.0             # экземпляр класса Float
-3.14           # экземпляр класса Float
6.02e23         # экземпляр класса Float (6.02 * 10^23)
Типы данных
                        Numeric

арифметика:
              x   =   5/2       #   =>   2
              y   =   5.0/2     #   =>   2.5
              z   =   5/2.0     #   =>   2.5
              x   =   5%2       #   =>   1
              x   =   1.5%0.4   #   =>   0.3

              2**4            # 16
              # вычисляется справа налево
              2**4**3         # равно 2**64, но не 16**3
Типы данных
                           String

'string'       # строка
"string"       # строка

# строковой литерал в двойных кавычках может включать ruby-
выражения
phone = "55-66-77"
"my phone is #{phone}"
$phone = "55-66-77"
"my phone is #$phone" # с глобальными переменными,
                      # переменными экземпляра и класса
                      # {} можно опустить
Типы данных
                     String
# ruby-строки мутабельны (mutable, изменчивы)
# на каждое появление строкового литерала в коде
программы
# создается новый объект
# поэтому крайне нежелательно использование строк
в циклах
5.times { puts "test".object_id }




# используйте символы
5.times { puts :test.object_id }
Типы данных
                         Array


[]                #   пустой массив
[1, 2, 3]         #   массив из трех объектов Fixnum
[[1,2], [3,4]]    #   массив из вложенных массивов
Array.new         #   => []
Array.new(3)      #   => [nil, nil, nil]
Array.new(3, 1)   #   => [1, 1, 1]
Типы данных
                            Array


a = [0, 1, 4, 9, 16]
a[0]              # => 0
a[-1]             # => 16
a[8] = 64         # => [0, 1, 4, 9, 16, nil, nil, nil, 64]
a[1, 1]           # => [1]
a[1, 2]           # => [1, 4]
a[0..2]           # => [0, 1, 4]
Типы данных
                          Hash

numbers = Hash.new
numbers["one"] = 1
numbers["two"] = 2
numbers["three"] = 3
sum = numbers["one"] + numbers["two"]

numbers = {"one" => 1, "two" => 2, "three" => 3}
numbers = {:one => 1, :two => 2, :three => 3}
# only ruby 1.9
numbers = {one: 1, two: 2, three: 3}
Типы данных
                        Range


1..10             # числа от 1 до 10, включая 10
1.0...10.0        # числа от 1.0 до 10.0, исключая 10.0
a = 1..10
a.include? 5      # => true: 5 входит в диапазон [1,5]
'a'..'d'          # буквы от a до d
('a'..'d').to_a   # => ['a', 'b', 'c', 'd']
Типы данных
    NilClass, TrueClass, FalseClass


единственные экземпляры своих классов:
      nil.class     # => NilClass
      false.class   # => FalseClass
      true.class    # => TrueClass
Объекты


•   в ruby все - объект

•   вся работа происходит со ссылками на объекты
    (все, кроме Fixnum и Symbol передается по
    ссылке)

•   каждый объект имеет свой уникальный и
    неизменный идентификатор (object_id)
Объекты


o = "test"              #   создаем новую переменную
o.class                 #   => String
o.class.superclass      #   => Object
o.class == String       #   => true
o.instance_of? String   #   => true
Объекты

x = 1
x.instance_of? Fixnum    #   => true
x.instance_of? Numeric   #   => false: instance_of?
                         #   не проверяет наследственность
x.is_a?   Fixnum         #   => true
x.is_a?   Numeric        #   => true
x.is_a?   Integer        #   => true
x.is_a?   Comparable     #   => true: is_a? работает
                         #   и с миксинами
Numeric === x            #   => true: идентично is_a?
                         #   но менее элегантно
Объекты


Однако, в ruby принято обращать внимание не на
           класс объекта, а на его тип

Тип объекта - это совокупность его признаков, а не
                 только его класс
Объекты
 Обычно считается, что объект принадлежит какому-то
 типу, если относительно него можно провести некие
определенные действия (вызвать определенные методы)


o.respond_to? :each   # результат true, если o обладает
                      # методом each


    типизация по общим признакам объекта носит
                  название "утиной":
    если это выглядит как утка, плавает как утка и
       крякает как утка, то, вероятно, это утка
Объекты

                   сравнение объектов
a = "ruby"
b = c = "ruby"
a.equal?(b)       # => false: a и b относятся к разным объектам
b.equal?(c)       # => true: b и c ссылаются на один объект
b.object_id == c.object_id

a == b            # => true: проверка по содержимому объекта

1 == 1.0          # true: в классах Numeric используется
                  # преобразование типов
1.eql?(1.0)       # false: строгая проверка
Структура программы
Лексическая, Синтаксическая, Структура файла
Лексическая структура.
                 Комментарии


# это комментарий
x = "# а это строка"
y = /# а это регулярное выражение/ # а вот здесь уже
комментарий

# а так принято
# писать многострочные комментарии
# в ruby нет многострочных комментариев like a C   /*..*/
Лексическая структура.
                   Комментарии


=begin а еще можно закомментировать
  опасный участок кода
  при помощи такого комментария
  такой стиль комментариев называется "Встроенный документ"
  и он не очень популярен в ruby
=end
Лексическая структура.
      Идентификаторы и пунктуация

•   Идентификатор - имя (переменные, методы,
    классы, модули, и т.д.)

•   состоят из букв, цифр и символов подчеркивания

•   не могут начинаться с цифр

•   идентификатор, начинающийся с заглавной буквы
    является константой

•   чувствительны к регистру
Лексическая структура.
            Идентификаторы и пунктуация

a
b2
new_value
_temp
PI              # константа


$files          #   глобальная переменная
@data           #   переменная экземпляра
@@counter       #   переменная класса
empty?          #   метод/предикат, возвращающий булево значение
sort!           #   метод, изменяющий объект
timeout=        #   метод, вызываемый присваиванием
Лексическая структура.
               Ключевые слова
__LINE__          do
                                or
__ENCODING__      else
                                redo
__FILE__          elsif
                                rescue
BEGIN             end
                                retry
END               ensure
                                then
alias             false
                                true
and               for
                                undef
begin             if
                                unless
break             in
                                until
case              module
                                when
class             next
                                while
def               nil
                                yield
defined?           not
Лексическая структура.
                  Разделители


•   как и в Си точка с запятой является символом
    конца оператора

•   однако, в ruby символ новой строки так же
    признак конца оператора

•   по соглашению, “;” обычно опускается
Лексическая структура.
                   Разделители


“нейтрализовать” конец строки можно символом “”

  total = thirst_very_long_name + second_long_name 
          + third_long_name
Лексическая структура.
                    Разделители


•   ruby позволяет опускать скобки при вызовах/
    объявлениях методов

•   однако, нужно быть аккуратным с пробелами:

        f(3+2)+1    # сумма f(3+2) и 1
        f (3+2)+1   # вызов f от выражения (3+2)+1
Синтаксическая структура
                  Выражения

•   Выражение - основной элемент синтаксиса Ruby

•   простейшие выражения - числовые и строковые
    литералы

•   выражения вычисляются интерпретатором и
    выдают значение

•   могут строиться составные выражения при
    помощи знаком операций
Синтаксическая структура
                   Выражения


1           #   первичное выражение
x           #   еще одно первичное выражение
x = 1       #   выражение присваивания
x = x + 1   #   выражение с двумя знаками операций
Синтаксическая структура
                           Выражения
if 10 > 1 then    # здесь "then" можно и принято опускать
  x += 1
end

while x < 10 do
  print x
  x = x + 1
end


3.times do |n|        #   do/end можно заменить на скобки {}
  print "step #{n}"   #   вариант со скобками принято
                      #   использовать в однострочных конструкциях:
end                   #   3.times {|n| print "step #{n}"}
Синтаксическая структура
                 Переменные




•   Переменная - просто имя для значения

•   создание переменной приходит при помощи
    оператора присваивания: (x = 2.0)
Синтаксическая структура
                Переменные

Вызов неинициализированное переменной:

•   переменная класса: ошибка NameError

•   переменная экземпляра: вернет nil

•   глобальная переменная: вернет nil

•   локальная переменная: в большинстве
    случаев выдаст ошибку NameError
Синтаксическая структура
                         Переменные


a = 0.0 if false   #   присваивание никогда не выполнится
print a            #   выводится nil
print b            #   NameError: переменной или метода b
                   #   никогда не существовало
Синтаксическая структура
                   Константы


•   Имя константы начинается с заглавной буквы

•   название класса/модуля - тоже константа

•   константа на самом деле не константа (может
    меняться)

•   нельзя присвоить значение константе в теле
    метода
Синтаксическая структура
                 Константы



соглашение:
              SomeConstant    # модуль или класс
              SOME_CONSTANT   # константа
              Some_Constant   # константа
Синтаксическая структура
                      Константы


Conversions::Area # константы могут быть вложенными
Area              # внутри модуля Conversions
                  # вычислится в Conversions::Area
::Area            # а так будет искаться
                  # в глобальной области видимости (Object)
Object::Area      # идентично ::Area
Синтаксическая структура
                       Методы


# объявление
def my_method(arg1, arg2, arg3 = nil) # скобки можно опустить
  # возвращает последнее вычисленное значение
end

# вызов
my_method 1, 2, :limit => 10
Синтаксическая структура
                 Присваивания

# обычное присваивание (вызов сеттера)
o.m = v
# фактически вызов метода:
o.m=(v)

# присваивание в массивах
o[x] = y
# эквивалентно
o.[]=(x, y)

# метод []= можно написать самому, например, с целью:
o[x, y] = z
# эквивалентно
o.[]=(x,y,z)
Синтаксическая структура
                Присваивания

# сокращенные присваивания
x += y    # x = x + y (следует заметить, в ruby нет
          # инкремента через x++)
x -= y    # x = x - y
x /= y    # x = x / y
x %= y    # x = x % y
x **= y   # x = x ** y
x &&= y   # x = x && y
x ||= y   # x = x || y
x &= y    # x = x & y
x |= y    # x = x | y
x ^= y    # x = x ^ y
x <<= y   # x = x << y
x >>= y   # x = x >> y
Синтаксическая структура
                      Присваивания

# параллельное присваивание
x, y, z = 1, 2, 3       # x = 1; y = 2; z = 3

x, y = y, x             # обмен значениями, параллельно
# не тоже самое, что:
x = y; y = x            # здесь вызовы последовательны

x = 1, 2, 3             # x = [1, 2, 3]
x, y, z = [1, 2, 3]     # x, y, z = 1, 2, 3

x, *y = 1, 2, 3         # x = 1; y = [2, 3]
Синтаксическая структура
              Присваивания


идиома:
          results ||= []
          results = results || []
Синтаксическая структура
               Операторы
+         <          ?:
-         <=         rescue   ||=
!         >=         =        |=
~         >          **=      ^=
**        ==         *=       defined?
*         ===        /=       not
/         !=         %=       and
%         =~         +=       or
<<        !~         -=       if
>>        <=>        <<=      unless
&         &&         >>=      while
|         ||         &&=      until
^         ..         &=
Синтаксическая структура
                Операторы

  # унарные операторы: - и +
  x = -x
  x = +x # просто вернет x

  # возведение в степень
  x = 2 ** 3 # x => 8

  #   арифметические операторы: +, -, *, /, %
  x   = 2 + 3
  y   = 7 / 0     # выдаст ZeroDivisionError
  z   = -5.0 / 0 # вернет -Infinity
Синтаксическая структура
                     Операторы


# сдвиг и добавление: << и >>
# сдвиг битов:
(0b1011 << 1).to_s(2)   # => "10110", 11 << 1 => 22
# чаще используется как добавление
message = "hello"
message << " world"
messages = []
messages << message
Синтаксическая структура
                          Операторы

#   сравнение: <, <=, >, >=, <=>
1   < 2     # => true
3   >= 3    # => true
4   <=> 2   # => 1 (-1 если меньше; 0 если равны; 1 если больше)

class A; end
class B < A; end
A < B # => false

String < Object      #   => true: String более узкий класс
Object > Numeric     #   => true: Object более общий класс
Numeric < Integer    #   => false: Numeric не является
                     #   более узким, чем Integer
String < Numeric     #   => nil: String и Numeric никак не связаны
Синтаксическая структура
                      Операторы


# равенство: ==, !=, =~, !~, ===
1 == 2               # => false
2 != 3               # => true
"message" =~ /e/     # => 1: позиция первого вхождения
                     # символа e согласно регулярке
5 === 5              # => true
(1..5) === 5         # => true: case-равенство
Синтаксическая структура
              Операторы


  # условный оператор: ?:
  a = b > c ? true : false


  #   defined?
  #   проверяет, определен ли его операнд
  #   пример использования:
  y   = f(x) if defined? f(x)
Структура файла

#!/bin/ruby -w       shebang-комментарий
# encoding: utf-8    кодировка программы

# code
#                       код программы
__END__          маркировка завершения кода

# another data      другие данные программы
Выполнение программы
•   ruby-программа - простой сценарий из
    операторов

•   исполнение программы происходит
    последовательно, в порядк обнаружения
    операторов

•   управляющие структуры (условия, циклы, и т.д.)
    влияют на порядок исполнения операторов

•   простейший запуск ruby программы выглядит как
    “ruby file.rb”
Управляющие структуры
Управляющие структуры
           if



        if x < 10
          x += 1
        else
          print x
        end
Управляющие структуры
                           if

if x == 1
  name = "один"          name = if x == 1; "один"
elsif x == 2                    elsif x == 2; "два"
  name = "два"                  elsif x == 3; "три"
elsif x == 3                    else "много"
  name = "три"                  end
end




       puts message if message   # модификатор if
Управляющие структуры
                      unless

•   противоположен if

•   нет конструкции elsif


s = unless o.nil?
      o.to_s
    end

s = o.to_s unless o.nil?    # модификатор unless
Управляющие структуры
           case
      name = case
        when x == 1
          "один"
        when x == 2
          "два"
        when x == 3
          "три"
      end

      name =   case x
        when   1; "один"
        when   2; "два"
        when   3; "три"
        else   "много"
      end
Управляющие структуры
       while/until

       x = 10
       while x >= 0 do
         puts x
         x -= 1
       end

       x = 0
       until x > 10 do
         puts x
         x += 1
       end
Управляющие структуры
                       while/until


x = 0                           # инстанцирование x
puts x = x + 1 while x < 10     # увеличение x на 1 пока x < 10

a = [1, 2, 3]                 # инициализация массива
puts a.pop until a.empty?     # извлечение элементов, пока
                              # массив не пустой
Управляющие структуры
               for-in


  array = [1, 2, 3, 4, 5]
  for element in array
    puts element
  end

  hash = {:a => 1, :b => 2, :c => 3}
  for key, value in hash
    puts "#{key} => #{value}"
  end
Управляющие структуры
                for-in


 # использование итератора вместо for-in
 array.each do |value|
   puts value
 end

 hash.each do |key, value|
   puts "#{key} => #{value}"
 end
Управляющие структуры
                      rescue/ensure


begin
  raise "Error!"               # бросаем исключение
rescue => e                    # обработка исключения
  p e
ensure                         # блок выполнится всегда
  print "все равно выполнится"
end

Contenu connexe

Tendances

Погружение в Dart
Погружение в DartПогружение в Dart
Погружение в DartSergey Penkovsky
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.Roman Brovko
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на rubyEvgeny Smirnov
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивамиEvgeny Smirnov
 
Управляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияУправляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияEvgeny Smirnov
 
Михаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияМихаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияYandex
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыUnguryan Vitaliy
 
Глава1: Обзор технологии Java
Глава1: Обзор технологии JavaГлава1: Обзор технологии Java
Глава1: Обзор технологии Javametaform
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILRoman Brovko
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 

Tendances (20)

Погружение в Dart
Погружение в DartПогружение в Dart
Погружение в Dart
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Scala #4
Scala #4Scala #4
Scala #4
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на ruby
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
 
Управляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияУправляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условия
 
Михаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияМихаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знания
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
Глава1: Обзор технологии Java
Глава1: Обзор технологии JavaГлава1: Обзор технологии Java
Глава1: Обзор технологии Java
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 

En vedette

Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runitAlexander Shcherbinin
 
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст примененияNikita Baksalyar
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияMichael Pankov
 
Rust All Hands Winter 2011
Rust All Hands Winter 2011Rust All Hands Winter 2011
Rust All Hands Winter 2011Patrick Walton
 
Задачи по ООП в ruby
Задачи по ООП в rubyЗадачи по ООП в ruby
Задачи по ООП в rubyEvgeny Smirnov
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...Claudio Capobianco
 
Go в автобусе
Go в автобусеGo в автобусе
Go в автобусеArtem Kovardin
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderIgor Dolzhikov
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесAnton Piskunov
 
Как ВКонтакте использует Go
Как ВКонтакте использует GoКак ВКонтакте использует Go
Как ВКонтакте использует GoArtem Kovardin
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelAlex Mikitenko
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновAnton Piskunov
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Mikhail Salosin
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Errbit - агрегатор сбоев в продакшене
Errbit - агрегатор сбоев в продакшенеErrbit - агрегатор сбоев в продакшене
Errbit - агрегатор сбоев в продакшенеAndrey Subbota
 

En vedette (20)

Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runit
 
Erlang
ErlangErlang
Erlang
 
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст применения
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Rust All Hands Winter 2011
Rust All Hands Winter 2011Rust All Hands Winter 2011
Rust All Hands Winter 2011
 
Задачи по ООП в ruby
Задачи по ООП в rubyЗадачи по ООП в ruby
Задачи по ООП в ruby
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...
 
Go в автобусе
Go в автобусеGo в автобусе
Go в автобусе
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в Openprovider
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
 
Golang
GolangGolang
Golang
 
Как ВКонтакте использует Go
Как ВКонтакте использует GoКак ВКонтакте использует Go
Как ВКонтакте использует Go
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object model
 
Ruby basics
Ruby basicsRuby basics
Ruby basics
 
OOP в Go
OOP в GoOOP в Go
OOP в Go
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демонов
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Errbit - агрегатор сбоев в продакшене
Errbit - агрегатор сбоев в продакшенеErrbit - агрегатор сбоев в продакшене
Errbit - агрегатор сбоев в продакшене
 

Similaire à Вторая лекция по основам ruby для студентов itc73.ru

Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Evgeny Borisov
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Pavel Tsukanov
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Ontico
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данныхЕлена Ключева
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Дополнительные возможности Javascript
Дополнительные возможности JavascriptДополнительные возможности Javascript
Дополнительные возможности JavascriptDenis Latushkin
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.Unguryan Vitaliy
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобовLidiya Myalkina
 
Rupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev RubyRupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev Rubyemarkine
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
 

Similaire à Вторая лекция по основам ruby для студентов itc73.ru (20)

Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Типы переменных Pascal
Типы переменных PascalТипы переменных Pascal
Типы переменных Pascal
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данных
 
паскаль
паскальпаскаль
паскаль
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Дополнительные возможности Javascript
Дополнительные возможности JavascriptДополнительные возможности Javascript
Дополнительные возможности Javascript
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
 
Rupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev RubyRupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev Ruby
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 

Вторая лекция по основам ruby для студентов itc73.ru

  • 4. Типы данных Numeric 123 # экземпляр класса Fixnum 1000000000 # один миллиард 1_000_000_000 # один миллиард 0377 # восьмеричное представление числа 255 0b1111_1111 # двоичное представление числа 255 0xFF # шестнадцатеричное представление числа 255 0.0 # экземпляр класса Float -3.14 # экземпляр класса Float 6.02e23 # экземпляр класса Float (6.02 * 10^23)
  • 5. Типы данных Numeric арифметика: x = 5/2 # => 2 y = 5.0/2 # => 2.5 z = 5/2.0 # => 2.5 x = 5%2 # => 1 x = 1.5%0.4 # => 0.3 2**4 # 16 # вычисляется справа налево 2**4**3 # равно 2**64, но не 16**3
  • 6. Типы данных String 'string' # строка "string" # строка # строковой литерал в двойных кавычках может включать ruby- выражения phone = "55-66-77" "my phone is #{phone}" $phone = "55-66-77" "my phone is #$phone" # с глобальными переменными,                       # переменными экземпляра и класса                       # {} можно опустить
  • 7. Типы данных String # ruby-строки мутабельны (mutable, изменчивы) # на каждое появление строкового литерала в коде программы # создается новый объект # поэтому крайне нежелательно использование строк в циклах 5.times { puts "test".object_id } # используйте символы 5.times { puts :test.object_id }
  • 8. Типы данных Array [] # пустой массив [1, 2, 3] # массив из трех объектов Fixnum [[1,2], [3,4]] # массив из вложенных массивов Array.new # => [] Array.new(3) # => [nil, nil, nil] Array.new(3, 1) # => [1, 1, 1]
  • 9. Типы данных Array a = [0, 1, 4, 9, 16] a[0] # => 0 a[-1] # => 16 a[8] = 64 # => [0, 1, 4, 9, 16, nil, nil, nil, 64] a[1, 1] # => [1] a[1, 2] # => [1, 4] a[0..2] # => [0, 1, 4]
  • 10. Типы данных Hash numbers = Hash.new numbers["one"] = 1 numbers["two"] = 2 numbers["three"] = 3 sum = numbers["one"] + numbers["two"] numbers = {"one" => 1, "two" => 2, "three" => 3} numbers = {:one => 1, :two => 2, :three => 3} # only ruby 1.9 numbers = {one: 1, two: 2, three: 3}
  • 11. Типы данных Range 1..10 # числа от 1 до 10, включая 10 1.0...10.0 # числа от 1.0 до 10.0, исключая 10.0 a = 1..10 a.include? 5 # => true: 5 входит в диапазон [1,5] 'a'..'d' # буквы от a до d ('a'..'d').to_a # => ['a', 'b', 'c', 'd']
  • 12. Типы данных NilClass, TrueClass, FalseClass единственные экземпляры своих классов: nil.class # => NilClass false.class # => FalseClass true.class # => TrueClass
  • 13. Объекты • в ruby все - объект • вся работа происходит со ссылками на объекты (все, кроме Fixnum и Symbol передается по ссылке) • каждый объект имеет свой уникальный и неизменный идентификатор (object_id)
  • 14. Объекты o = "test" # создаем новую переменную o.class # => String o.class.superclass # => Object o.class == String # => true o.instance_of? String # => true
  • 15. Объекты x = 1 x.instance_of? Fixnum # => true x.instance_of? Numeric # => false: instance_of? # не проверяет наследственность x.is_a? Fixnum # => true x.is_a? Numeric # => true x.is_a? Integer # => true x.is_a? Comparable # => true: is_a? работает # и с миксинами Numeric === x # => true: идентично is_a? # но менее элегантно
  • 16. Объекты Однако, в ruby принято обращать внимание не на класс объекта, а на его тип Тип объекта - это совокупность его признаков, а не только его класс
  • 17. Объекты Обычно считается, что объект принадлежит какому-то типу, если относительно него можно провести некие определенные действия (вызвать определенные методы) o.respond_to? :each # результат true, если o обладает # методом each типизация по общим признакам объекта носит название "утиной": если это выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка
  • 18. Объекты сравнение объектов a = "ruby" b = c = "ruby" a.equal?(b) # => false: a и b относятся к разным объектам b.equal?(c) # => true: b и c ссылаются на один объект b.object_id == c.object_id a == b # => true: проверка по содержимому объекта 1 == 1.0 # true: в классах Numeric используется # преобразование типов 1.eql?(1.0) # false: строгая проверка
  • 20. Лексическая структура. Комментарии # это комментарий x = "# а это строка" y = /# а это регулярное выражение/ # а вот здесь уже комментарий # а так принято # писать многострочные комментарии # в ruby нет многострочных комментариев like a C /*..*/
  • 21. Лексическая структура. Комментарии =begin а еще можно закомментировать опасный участок кода при помощи такого комментария такой стиль комментариев называется "Встроенный документ" и он не очень популярен в ruby =end
  • 22. Лексическая структура. Идентификаторы и пунктуация • Идентификатор - имя (переменные, методы, классы, модули, и т.д.) • состоят из букв, цифр и символов подчеркивания • не могут начинаться с цифр • идентификатор, начинающийся с заглавной буквы является константой • чувствительны к регистру
  • 23. Лексическая структура. Идентификаторы и пунктуация a b2 new_value _temp PI # константа $files # глобальная переменная @data # переменная экземпляра @@counter # переменная класса empty? # метод/предикат, возвращающий булево значение sort! # метод, изменяющий объект timeout= # метод, вызываемый присваиванием
  • 24. Лексическая структура. Ключевые слова __LINE__ do or __ENCODING__ else redo __FILE__ elsif rescue BEGIN end retry END ensure then alias false true and for undef begin if unless break in until case module when class next while def nil yield defined? not
  • 25. Лексическая структура. Разделители • как и в Си точка с запятой является символом конца оператора • однако, в ruby символ новой строки так же признак конца оператора • по соглашению, “;” обычно опускается
  • 26. Лексическая структура. Разделители “нейтрализовать” конец строки можно символом “” total = thirst_very_long_name + second_long_name         + third_long_name
  • 27. Лексическая структура. Разделители • ruby позволяет опускать скобки при вызовах/ объявлениях методов • однако, нужно быть аккуратным с пробелами: f(3+2)+1 # сумма f(3+2) и 1 f (3+2)+1 # вызов f от выражения (3+2)+1
  • 28. Синтаксическая структура Выражения • Выражение - основной элемент синтаксиса Ruby • простейшие выражения - числовые и строковые литералы • выражения вычисляются интерпретатором и выдают значение • могут строиться составные выражения при помощи знаком операций
  • 29. Синтаксическая структура Выражения 1 # первичное выражение x # еще одно первичное выражение x = 1 # выражение присваивания x = x + 1 # выражение с двумя знаками операций
  • 30. Синтаксическая структура Выражения if 10 > 1 then # здесь "then" можно и принято опускать   x += 1 end while x < 10 do   print x   x = x + 1 end 3.times do |n| # do/end можно заменить на скобки {}   print "step #{n}" # вариант со скобками принято # использовать в однострочных конструкциях: end # 3.times {|n| print "step #{n}"}
  • 31. Синтаксическая структура Переменные • Переменная - просто имя для значения • создание переменной приходит при помощи оператора присваивания: (x = 2.0)
  • 32. Синтаксическая структура Переменные Вызов неинициализированное переменной: • переменная класса: ошибка NameError • переменная экземпляра: вернет nil • глобальная переменная: вернет nil • локальная переменная: в большинстве случаев выдаст ошибку NameError
  • 33. Синтаксическая структура Переменные a = 0.0 if false # присваивание никогда не выполнится print a # выводится nil print b # NameError: переменной или метода b # никогда не существовало
  • 34. Синтаксическая структура Константы • Имя константы начинается с заглавной буквы • название класса/модуля - тоже константа • константа на самом деле не константа (может меняться) • нельзя присвоить значение константе в теле метода
  • 35. Синтаксическая структура Константы соглашение: SomeConstant # модуль или класс SOME_CONSTANT # константа Some_Constant # константа
  • 36. Синтаксическая структура Константы Conversions::Area # константы могут быть вложенными Area # внутри модуля Conversions # вычислится в Conversions::Area ::Area # а так будет искаться # в глобальной области видимости (Object) Object::Area # идентично ::Area
  • 37. Синтаксическая структура Методы # объявление def my_method(arg1, arg2, arg3 = nil) # скобки можно опустить   # возвращает последнее вычисленное значение end # вызов my_method 1, 2, :limit => 10
  • 38. Синтаксическая структура Присваивания # обычное присваивание (вызов сеттера) o.m = v # фактически вызов метода: o.m=(v) # присваивание в массивах o[x] = y # эквивалентно o.[]=(x, y) # метод []= можно написать самому, например, с целью: o[x, y] = z # эквивалентно o.[]=(x,y,z)
  • 39. Синтаксическая структура Присваивания # сокращенные присваивания x += y # x = x + y (следует заметить, в ruby нет # инкремента через x++) x -= y # x = x - y x /= y # x = x / y x %= y # x = x % y x **= y # x = x ** y x &&= y # x = x && y x ||= y # x = x || y x &= y # x = x & y x |= y # x = x | y x ^= y # x = x ^ y x <<= y # x = x << y x >>= y # x = x >> y
  • 40. Синтаксическая структура Присваивания # параллельное присваивание x, y, z = 1, 2, 3 # x = 1; y = 2; z = 3 x, y = y, x # обмен значениями, параллельно # не тоже самое, что: x = y; y = x # здесь вызовы последовательны x = 1, 2, 3 # x = [1, 2, 3] x, y, z = [1, 2, 3] # x, y, z = 1, 2, 3 x, *y = 1, 2, 3 # x = 1; y = [2, 3]
  • 41. Синтаксическая структура Присваивания идиома: results ||= [] results = results || []
  • 42. Синтаксическая структура Операторы + < ?: - <= rescue ||= ! >= = |= ~ > **= ^= ** == *= defined? * === /= not / != %= and % =~ += or << !~ -= if >> <=> <<= unless & && >>= while | || &&= until ^ .. &=
  • 43. Синтаксическая структура Операторы # унарные операторы: - и + x = -x x = +x # просто вернет x # возведение в степень x = 2 ** 3 # x => 8 # арифметические операторы: +, -, *, /, % x = 2 + 3 y = 7 / 0 # выдаст ZeroDivisionError z = -5.0 / 0 # вернет -Infinity
  • 44. Синтаксическая структура Операторы # сдвиг и добавление: << и >> # сдвиг битов: (0b1011 << 1).to_s(2) # => "10110", 11 << 1 => 22 # чаще используется как добавление message = "hello" message << " world" messages = [] messages << message
  • 45. Синтаксическая структура Операторы # сравнение: <, <=, >, >=, <=> 1 < 2 # => true 3 >= 3 # => true 4 <=> 2 # => 1 (-1 если меньше; 0 если равны; 1 если больше) class A; end class B < A; end A < B # => false String < Object # => true: String более узкий класс Object > Numeric # => true: Object более общий класс Numeric < Integer # => false: Numeric не является                      # более узким, чем Integer String < Numeric # => nil: String и Numeric никак не связаны
  • 46. Синтаксическая структура Операторы # равенство: ==, !=, =~, !~, === 1 == 2 # => false 2 != 3 # => true "message" =~ /e/ # => 1: позиция первого вхождения # символа e согласно регулярке 5 === 5 # => true (1..5) === 5 # => true: case-равенство
  • 47. Синтаксическая структура Операторы # условный оператор: ?: a = b > c ? true : false # defined? # проверяет, определен ли его операнд # пример использования: y = f(x) if defined? f(x)
  • 48. Структура файла #!/bin/ruby -w shebang-комментарий # encoding: utf-8 кодировка программы # code # код программы __END__ маркировка завершения кода # another data другие данные программы
  • 49. Выполнение программы • ruby-программа - простой сценарий из операторов • исполнение программы происходит последовательно, в порядк обнаружения операторов • управляющие структуры (условия, циклы, и т.д.) влияют на порядок исполнения операторов • простейший запуск ruby программы выглядит как “ruby file.rb”
  • 51. Управляющие структуры if if x < 10   x += 1 else   print x end
  • 52. Управляющие структуры if if x == 1   name = "один" name = if x == 1; "один" elsif x == 2        elsif x == 2; "два"   name = "два"        elsif x == 3; "три" elsif x == 3        else "много"   name = "три"        end end puts message if message # модификатор if
  • 53. Управляющие структуры unless • противоположен if • нет конструкции elsif s = unless o.nil?       o.to_s     end s = o.to_s unless o.nil? # модификатор unless
  • 54. Управляющие структуры case name = case   when x == 1     "один"   when x == 2     "два"   when x == 3     "три" end name = case x   when 1; "один"   when 2; "два"   when 3; "три"   else "много" end
  • 55. Управляющие структуры while/until x = 10 while x >= 0 do   puts x   x -= 1 end x = 0 until x > 10 do   puts x   x += 1 end
  • 56. Управляющие структуры while/until x = 0 # инстанцирование x puts x = x + 1 while x < 10 # увеличение x на 1 пока x < 10 a = [1, 2, 3] # инициализация массива puts a.pop until a.empty? # извлечение элементов, пока # массив не пустой
  • 57. Управляющие структуры for-in array = [1, 2, 3, 4, 5] for element in array   puts element end hash = {:a => 1, :b => 2, :c => 3} for key, value in hash   puts "#{key} => #{value}" end
  • 58. Управляющие структуры for-in # использование итератора вместо for-in array.each do |value|   puts value end hash.each do |key, value|   puts "#{key} => #{value}" end
  • 59. Управляющие структуры rescue/ensure begin   raise "Error!" # бросаем исключение rescue => e # обработка исключения   p e ensure # блок выполнится всегда   print "все равно выполнится" end