Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Время Ruby

Время Ruby

Прошлое, настоящее, будущее одного прекрасного языка

Avatar for tetiana chupryna

tetiana chupryna

July 04, 2018
Tweet

More Decks by tetiana chupryna

Other Decks in Programming

Transcript

  1. C

  2. C++

  3. C#

  4. PHP

  5. ㊗Японский язык • Несколько алфавитов, много синонимов • Эстетика написания

    • Мультипарадигменность • Синтаксический сахар • Удовольствие от использования
  6. Perl • Гибкость и многофункциональность, “Скотч для интернета” • Использование

    для скриптов • Регулярные выражения • Синтаксис, использование скобок, объявление классов
  7. Утиная типизация class Array def size @last_el_num end end class

    DuckArray def size 42 end end class Pond def initialize(animals) @animals = animals end def how_many? @animals.size end end
  8. Monkey patching class Array def size @last_el_num == 0 ?

    0 : @last_el_num - 1 end end my_arr = [1, ‘two', :three] my_arr.size # => 2
  9. Замыкания class Object def tap yield self self end end

    user = User.new.tap do |u| u.build_profile u.send_email_confirmation u.do_magic end
  10. Метапрограммирование class RoseTree ["blue", "pink", "red"].each do |color| define_method("grow_#{color}_flowers") do

    |size| pp "Growing #{size} #{color} flowers." end end end plant = RoseTree.new puts plant.grow_blue_flower(2) puts plant.grow_red_flower(4) puts plant.grow_pink_flower(8)
  11. Имплементации • MRI / Matz's Ruby Interpreter / CRuby (YARV

    interpreter) • mruby • JRuby • Rubinius • RubyMotion • ironRuby
  12. Многопоточность • Нет параллельности • Гильдии в Ruby 3 •

    Внешние C (POSIX) потоки могут запускаться параллельно
  13. Rack # hello_world.rb require 'rack' require 'rack/server' class HelloWorld def

    response [200, {}, 'Hello World'] end end class HelloWorldApp def self.call(env) HelloWorld.new.response end end Rack::Server.start :app => HelloWorldApp
  14. ActiveRecord class RateCard < ApplicationRecord belongs_to :currency has_one :application has_many

    :assoc_skills has_many :skills, through: :assoc_skills def self.search_by(params) where(qualification_id: params[:q_id]) .order(:qualification_id) .first end end end
  15. ActiveSupport • Ruby расширение • Работа со строками, датами, временем

    и прочее • HashWithIndifferentAccess • #blank? • #try(:method)
  16. ActionController <%= form_for @user do |f| %> <%= f.text_field :username

    %> <%= f.text_field :password %> <% end %> class UsersController < ApplicationController before_action :login def index @users = User.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users} format.json { render :json => @users} end end end users_controller.rb users/show.html.erb
  17. RSpec describe '#type_id' do let(:resource) { FactoryGirl.create :device } let(:type)

    { Type.find resource.type_id } it 'sets the type_id field' do expect(resource.type_id).to equal(type.id) end end
  18. Bundle source "http://rubygems.org" ruby '2.3.1' gem 'dotenv' gem 'enumerize' gem

    'grape' gem 'grape-swagger' gem 'grape-entity' gem 'pg' gem 'rack' gem 'rack-env' gem 'rake' gem 'rubocop' gem 'sequel' gem 'slack-notifier' group :development, :test do gem 'byebug' gem 'pry' gem 'rspec' gem 'rack-test' gem 'factory_girl' end
  19. Библиотеки • Dry • Trailblazer • Devise / Sorcery /

    Doorkeeper • CanCanCan / Pundit • Capistrano • Jbuilder / ActiveModel::Serializer
  20. Grape # Example config.ru require 'sinatra' require 'grape' class API

    < Grape::API get :hello do { hello: 'world' } end end class Web < Sinatra::Base get '/' do 'Hello world.' end end use Rack::Session::Cookie run Rack::Cascade.new [API, Web]