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

2,540 views

Published on

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,540
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
31
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Вторая лекция по основам 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

×