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

Время Ruby

Время Ruby

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

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]