Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,652 views

Published on

Published in: Technology
  • Be the first to comment

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

  1. 1. RubyОсновы
  2. 2. Типы данных
  3. 3. Типы данных
  4. 4. Типы данных Numeric123 # экземпляр класса Fixnum1000000000 # один миллиард1_000_000_000 # один миллиард0377 # восьмеричное представление числа 2550b1111_1111 # двоичное представление числа 2550xFF # шестнадцатеричное представление числа 2550.0 # экземпляр класса Float-3.14 # экземпляр класса Float6.02e23 # экземпляр класса Float (6.02 * 10^23)
  5. 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. 6. Типы данных Stringstring # строка"string" # строка# строковой литерал в двойных кавычках может включать ruby-выраженияphone = "55-66-77""my phone is #{phone}"$phone = "55-66-77""my phone is #$phone" # с глобальными переменными,                      # переменными экземпляра и класса                      # {} можно опустить
  7. 7. Типы данных String# ruby-строки мутабельны (mutable, изменчивы)# на каждое появление строкового литерала в кодепрограммы# создается новый объект# поэтому крайне нежелательно использование строкв циклах5.times { puts "test".object_id }# используйте символы5.times { puts :test.object_id }
  8. 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. 9. Типы данных Arraya = [0, 1, 4, 9, 16]a[0] # => 0a[-1] # => 16a[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. 10. Типы данных Hashnumbers = Hash.newnumbers["one"] = 1numbers["two"] = 2numbers["three"] = 3sum = numbers["one"] + numbers["two"]numbers = {"one" => 1, "two" => 2, "three" => 3}numbers = {:one => 1, :two => 2, :three => 3}# only ruby 1.9numbers = {one: 1, two: 2, three: 3}
  11. 11. Типы данных Range1..10 # числа от 1 до 10, включая 101.0...10.0 # числа от 1.0 до 10.0, исключая 10.0a = 1..10a.include? 5 # => true: 5 входит в диапазон [1,5]a..d # буквы от a до d(a..d).to_a # => [a, b, c, d]
  12. 12. Типы данных NilClass, TrueClass, FalseClassединственные экземпляры своих классов: nil.class # => NilClass false.class # => FalseClass true.class # => TrueClass
  13. 13. Объекты• в ruby все - объект• вся работа происходит со ссылками на объекты (все, кроме Fixnum и Symbol передается по ссылке)• каждый объект имеет свой уникальный и неизменный идентификатор (object_id)
  14. 14. Объектыo = "test" # создаем новую переменнуюo.class # => Stringo.class.superclass # => Objecto.class == String # => trueo.instance_of? String # => true
  15. 15. Объектыx = 1x.instance_of? Fixnum # => truex.instance_of? Numeric # => false: instance_of? # не проверяет наследственностьx.is_a? Fixnum # => truex.is_a? Numeric # => truex.is_a? Integer # => truex.is_a? Comparable # => true: is_a? работает # и с миксинамиNumeric === x # => true: идентично is_a? # но менее элегантно
  16. 16. ОбъектыОднако, в ruby принято обращать внимание не на класс объекта, а на его типТип объекта - это совокупность его признаков, а не только его класс
  17. 17. Объекты Обычно считается, что объект принадлежит какому-то типу, если относительно него можно провести некиеопределенные действия (вызвать определенные методы)o.respond_to? :each # результат true, если o обладает # методом each типизация по общим признакам объекта носит название "утиной": если это выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка
  18. 18. Объекты сравнение объектовa = "ruby"b = c = "ruby"a.equal?(b) # => false: a и b относятся к разным объектамb.equal?(c) # => true: b и c ссылаются на один объектb.object_id == c.object_ida == b # => true: проверка по содержимому объекта1 == 1.0 # true: в классах Numeric используется # преобразование типов1.eql?(1.0) # false: строгая проверка
  19. 19. Структура программыЛексическая, Синтаксическая, Структура файла
  20. 20. Лексическая структура. Комментарии# это комментарийx = "# а это строка"y = /# а это регулярное выражение/ # а вот здесь ужекомментарий# а так принято# писать многострочные комментарии# в ruby нет многострочных комментариев like a C /*..*/
  21. 21. Лексическая структура. Комментарии=begin а еще можно закомментировать опасный участок кода при помощи такого комментария такой стиль комментариев называется "Встроенный документ" и он не очень популярен в ruby=end
  22. 22. Лексическая структура. Идентификаторы и пунктуация• Идентификатор - имя (переменные, методы, классы, модули, и т.д.)• состоят из букв, цифр и символов подчеркивания• не могут начинаться с цифр• идентификатор, начинающийся с заглавной буквы является константой• чувствительны к регистру
  23. 23. Лексическая структура. Идентификаторы и пунктуацияab2new_value_tempPI # константа$files # глобальная переменная@data # переменная экземпляра@@counter # переменная классаempty? # метод/предикат, возвращающий булево значениеsort! # метод, изменяющий объектtimeout= # метод, вызываемый присваиванием
  24. 24. Лексическая структура. Ключевые слова__LINE__ do or__ENCODING__ else redo__FILE__ elsif rescueBEGIN end retryEND ensure thenalias false trueand for undefbegin if unlessbreak in untilcase module whenclass next whiledef nil yielddefined? not
  25. 25. Лексическая структура. Разделители• как и в Си точка с запятой является символом конца оператора• однако, в ruby символ новой строки так же признак конца оператора• по соглашению, “;” обычно опускается
  26. 26. Лексическая структура. Разделители“нейтрализовать” конец строки можно символом “” total = thirst_very_long_name + second_long_name         + third_long_name
  27. 27. Лексическая структура. Разделители• ruby позволяет опускать скобки при вызовах/ объявлениях методов• однако, нужно быть аккуратным с пробелами: f(3+2)+1 # сумма f(3+2) и 1 f (3+2)+1 # вызов f от выражения (3+2)+1
  28. 28. Синтаксическая структура Выражения• Выражение - основной элемент синтаксиса Ruby• простейшие выражения - числовые и строковые литералы• выражения вычисляются интерпретатором и выдают значение• могут строиться составные выражения при помощи знаком операций
  29. 29. Синтаксическая структура Выражения1 # первичное выражениеx # еще одно первичное выражениеx = 1 # выражение присваиванияx = x + 1 # выражение с двумя знаками операций
  30. 30. Синтаксическая структура Выраженияif 10 > 1 then # здесь "then" можно и принято опускать  x += 1endwhile x < 10 do  print x  x = x + 1end3.times do |n| # do/end можно заменить на скобки {}  print "step #{n}" # вариант со скобками принято # использовать в однострочных конструкциях:end # 3.times {|n| print "step #{n}"}
  31. 31. Синтаксическая структура Переменные• Переменная - просто имя для значения• создание переменной приходит при помощи оператора присваивания: (x = 2.0)
  32. 32. Синтаксическая структура ПеременныеВызов неинициализированное переменной:• переменная класса: ошибка NameError• переменная экземпляра: вернет nil• глобальная переменная: вернет nil• локальная переменная: в большинстве случаев выдаст ошибку NameError
  33. 33. Синтаксическая структура Переменныеa = 0.0 if false # присваивание никогда не выполнитсяprint a # выводится nilprint b # NameError: переменной или метода b # никогда не существовало
  34. 34. Синтаксическая структура Константы• Имя константы начинается с заглавной буквы• название класса/модуля - тоже константа• константа на самом деле не константа (может меняться)• нельзя присвоить значение константе в теле метода
  35. 35. Синтаксическая структура Константысоглашение: SomeConstant # модуль или класс SOME_CONSTANT # константа Some_Constant # константа
  36. 36. Синтаксическая структура КонстантыConversions::Area # константы могут быть вложеннымиArea # внутри модуля Conversions # вычислится в Conversions::Area::Area # а так будет искаться # в глобальной области видимости (Object)Object::Area # идентично ::Area
  37. 37. Синтаксическая структура Методы# объявлениеdef my_method(arg1, arg2, arg3 = nil) # скобки можно опустить  # возвращает последнее вычисленное значениеend# вызовmy_method 1, 2, :limit => 10
  38. 38. Синтаксическая структура Присваивания# обычное присваивание (вызов сеттера)o.m = v# фактически вызов метода:o.m=(v)# присваивание в массивахo[x] = y# эквивалентноo.[]=(x, y)# метод []= можно написать самому, например, с целью:o[x, y] = z# эквивалентноo.[]=(x,y,z)
  39. 39. Синтаксическая структура Присваивания# сокращенные присваиванияx += y # x = x + y (следует заметить, в ruby нет # инкремента через x++)x -= y # x = x - yx /= y # x = x / yx %= y # x = x % yx **= y # x = x ** yx &&= y # x = x && yx ||= y # x = x || yx &= y # x = x & yx |= y # x = x | yx ^= y # x = x ^ yx <<= y # x = x << yx >>= y # x = x >> y
  40. 40. Синтаксическая структура Присваивания# параллельное присваиваниеx, y, z = 1, 2, 3 # x = 1; y = 2; z = 3x, 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, 3x, *y = 1, 2, 3 # x = 1; y = [2, 3]
  41. 41. Синтаксическая структура Присваиванияидиома: results ||= [] results = results || []
  42. 42. Синтаксическая структура Операторы+ < ?:- <= rescue ||=! >= = |=~ > **= ^=** == *= defined?* === /= not/ != %= and% =~ += or<< !~ -= if>> <=> <<= unless& && >>= while| || &&= until^ .. &=
  43. 43. Синтаксическая структура Операторы # унарные операторы: - и + x = -x x = +x # просто вернет x # возведение в степень x = 2 ** 3 # x => 8 # арифметические операторы: +, -, *, /, % x = 2 + 3 y = 7 / 0 # выдаст ZeroDivisionError z = -5.0 / 0 # вернет -Infinity
  44. 44. Синтаксическая структура Операторы# сдвиг и добавление: << и >># сдвиг битов:(0b1011 << 1).to_s(2) # => "10110", 11 << 1 => 22# чаще используется как добавлениеmessage = "hello"message << " world"messages = []messages << message
  45. 45. Синтаксическая структура Операторы# сравнение: <, <=, >, >=, <=>1 < 2 # => true3 >= 3 # => true4 <=> 2 # => 1 (-1 если меньше; 0 если равны; 1 если больше)class A; endclass B < A; endA < B # => falseString < Object # => true: String более узкий классObject > Numeric # => true: Object более общий классNumeric < Integer # => false: Numeric не является                     # более узким, чем IntegerString < Numeric # => nil: String и Numeric никак не связаны
  46. 46. Синтаксическая структура Операторы# равенство: ==, !=, =~, !~, ===1 == 2 # => false2 != 3 # => true"message" =~ /e/ # => 1: позиция первого вхождения # символа e согласно регулярке5 === 5 # => true(1..5) === 5 # => true: case-равенство
  47. 47. Синтаксическая структура Операторы # условный оператор: ?: a = b > c ? true : false # defined? # проверяет, определен ли его операнд # пример использования: y = f(x) if defined? f(x)
  48. 48. Структура файла#!/bin/ruby -w shebang-комментарий# encoding: utf-8 кодировка программы# code# код программы__END__ маркировка завершения кода# another data другие данные программы
  49. 49. Выполнение программы• ruby-программа - простой сценарий из операторов• исполнение программы происходит последовательно, в порядк обнаружения операторов• управляющие структуры (условия, циклы, и т.д.) влияют на порядок исполнения операторов• простейший запуск ruby программы выглядит как “ruby file.rb”
  50. 50. Управляющие структуры
  51. 51. Управляющие структуры if if x < 10   x += 1 else   print x end
  52. 52. Управляющие структуры ifif x == 1  name = "один" name = if x == 1; "один"elsif x == 2        elsif x == 2; "два"  name = "два"        elsif x == 3; "три"elsif x == 3        else "много"  name = "три"        endend puts message if message # модификатор if
  53. 53. Управляющие структуры unless• противоположен if• нет конструкции elsifs = unless o.nil?      o.to_s    ends = o.to_s unless o.nil? # модификатор unless
  54. 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. 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. 56. Управляющие структуры while/untilx = 0 # инстанцирование xputs x = x + 1 while x < 10 # увеличение x на 1 пока x < 10a = [1, 2, 3] # инициализация массиваputs a.pop until a.empty? # извлечение элементов, пока # массив не пустой
  57. 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. 58. Управляющие структуры for-in # использование итератора вместо for-in array.each do |value|   puts value end hash.each do |key, value|   puts "#{key} => #{value}" end
  59. 59. Управляющие структуры rescue/ensurebegin  raise "Error!" # бросаем исключениеrescue => e # обработка исключения  p eensure # блок выполнится всегда  print "все равно выполнится"end

×