Top Banner
Почему все так любят ruby? Юрий Хрусталев, Deep Refactoring, 28.09.2016
95

Why everyone like ruby

Feb 08, 2017

Download

Engineering

Ivan Grishaev
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Why everyone like ruby

Почему все так любят ruby?

Юрий Хрусталев, Deep Refactoring, 28.09.2016

Page 2: Why everyone like ruby

О чем это?● О стереотипах

● ruby - удобно, элегантно, просто, понятно

● ruby - инструмент Силиконовой Долины

● ruby лучше, чем python*

* конечно нет

Page 3: Why everyone like ruby

Почему?● Я недавно начал писать на ruby on rails

● До этого я 4 года писал на python

● Wat? https://www.destroyallsoftware.com/talks/wat

Page 4: Why everyone like ruby

Плохая Махачкала Ruby

Page 5: Why everyone like ruby

class Foo def initialize puts 'hi' endend

Page 6: Why everyone like ruby

class Foo def initialize puts 'hi' endend

Foo.new# А почему метод initialize, не new?

Page 7: Why everyone like ruby

irb(main):001:0> bool

Page 8: Why everyone like ruby

irb(main):001:0> boolNameError: undefined local variable or method `bool' for main:Object from (irb):1 from /usr/bin/irb:12:in `<main>'

# Ок, это же язык с продвинутым ООП

Page 9: Why everyone like ruby

irb(main):002:0> "".to_b

Page 10: Why everyone like ruby

irb(main):002:0> "".to_bNoMethodError: undefined method `to_b' for "":String from (irb):1 from /usr/bin/irb:12:in `<main>' # Где метод у объекта, это же ООП язык?

Page 11: Why everyone like ruby

irb(main):003:0> !!""

Page 12: Why everyone like ruby

irb(main):003:0> !!""(irb):2: warning: string literal in condition=> true

# Почему warning?# Нужно сравнивать через ==

Page 13: Why everyone like ruby

irb(main):003:0> !!""(irb):2: warning: string literal in condition=> true

# Почему warning?# Нужно сравнивать через ==# Почему оно true?

Page 14: Why everyone like ruby

irb(main):004:0> !!{}

Page 15: Why everyone like ruby

irb(main):004:0> !!{}=> true

Page 16: Why everyone like ruby

irb(main):004:0> !!{}=> trueirb(main):005:0> !![]

Page 17: Why everyone like ruby

irb(main):004:0> !!{}=> trueirb(main):005:0> !![]=> true

Page 18: Why everyone like ruby

irb(main):004:0> !!{}=> trueirb(main):005:0> !![]=> trueirb(main):006:0> !!Object.new

Page 19: Why everyone like ruby

irb(main):004:0> !!{}=> trueirb(main):005:0> !![]=> trueirb(main):006:0> !!Object.new=> true

# Ничто не false, кроме false/nil/собственного ==

Page 20: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> true

Page 21: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> trueirb(main):002:0> [].blank?

Page 22: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> trueirb(main):002:0> [].blank?=> true

Page 23: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> trueirb(main):002:0> [].blank?=> trueirb(main):003:0> nil.blank?

Page 24: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> trueirb(main):002:0> [].blank?=> trueirb(main):003:0> nil.blank?=> true

Page 25: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> trueirb(main):002:0> [].blank?=> trueirb(main):003:0> nil.blank?=> trueirb(main):004:0> 0.blank?

Page 26: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> trueirb(main):002:0> [].blank?=> trueirb(main):003:0> nil.blank?=> trueirb(main):004:0> 0.blank?=> false

Page 27: Why everyone like ruby

# Ruby? Это такой DSL для написания Rails-приложений?

irb(main):001:0> require 'active_support/all'=> trueirb(main):002:0> [].blank?=> trueirb(main):003:0> nil.blank?=> trueirb(main):004:0> 0.blank?=> false# нормально же общались

Page 28: Why everyone like ruby

# Python

>>> arr = [1, 2, 3]>>> map(str, arr)["1", "2", "3"]

Page 29: Why everyone like ruby

irb(main):001:0> arr = [1, 2, 3]=> [1, 2, 3]

Page 30: Why everyone like ruby

irb(main):001:0> arr = [1, 2, 3]=> [1, 2, 3]irb(main):002:0> arr.map {|item| item.to_s}=> ["1", "2", "3"]

Page 31: Why everyone like ruby

irb(main):001:0> arr = [1, 2, 3]=> [1, 2, 3]irb(main):002:0> arr.map {|item| item.to_s}=> ["1", "2", "3"]irb(main):003:0> arr.map(&:to_s)=> ["1", "2", "3"]

# &: - указатель на имя метода

Page 32: Why everyone like ruby

irb(main):001:0> arr = ["1", "2", "3"]=> ["1", "2", "3"]

Page 33: Why everyone like ruby

irb(main):001:0> arr = ["1", "2", "3"]=> ["1", "2", "3"]irb(main):002:0> arr.map(&:String.new)

Page 34: Why everyone like ruby

irb(main):001:0> arr = ["1", "2", "3"]=> ["1", "2", "3"]irb(main):002:0> arr.map(&:String.new)NoMethodError: undefined method `new' for :String:Symbol from (irb):26 from /usr/bin/irb:12:in `<main>'

# это было бы слишком элегантно

Page 35: Why everyone like ruby

irb(main):003:0> arr.map(&String.method(:new))

Page 36: Why everyone like ruby

irb(main):003:0> arr.map(&String.method(:new))=> ["1", "2", "3"]

# это удобно

Page 37: Why everyone like ruby

# chain.rbx = ' foo bar ' .strip .split(' ')puts x.to_s

Page 38: Why everyone like ruby

# chain.rbx = ' foo bar ' .strip .split(' ')puts x.to_s

irb(main):001:0> load './chain.rb'[1, 2]=> nil

Page 39: Why everyone like ruby

# chain.rbx = ' foo bar ' #.strip .split(' ')puts x.to_s

Page 40: Why everyone like ruby

irb(main):001:0> load './chain.rb'SyntaxError: /tmp/code.rb:4: syntax error, unexpected '.', expecting end-of-input .split(' ')^ from (irb):15:in `load'from (irb):15from /usr/bin/irb:12:in `<main>'

# даже python так не делает

Page 41: Why everyone like ruby

irb(main):001:0> String.new "x"

Page 42: Why everyone like ruby

irb(main):001:0> String.new "x"=> "x"

Page 43: Why everyone like ruby

irb(main):001:0> String.new "x"=> "x"irb(main):002:0> String.new("x")

Page 44: Why everyone like ruby

irb(main):001:0> String.new "x"=> "x"irb(main):002:0> String.new("x")=> "x"

Page 45: Why everyone like ruby

irb(main):001:0> String.new "x"=> "x"irb(main):002:0> String.new("x")=> "x"irb(main):003:0> String.new( "x" )

Page 46: Why everyone like ruby

irb(main):001:0> String.new "x"=> "x"irb(main):002:0> String.new("x")=> "x"irb(main):003:0> String.new( "x" )=> "x"

Page 47: Why everyone like ruby

irb(main):001:0> String.new "x"=> "x"irb(main):002:0> String.new("x")=> "x"irb(main):003:0> String.new( "x" )=> "x"irb(main):004:0> String.new ("x")

Page 48: Why everyone like ruby

irb(main):001:0> String.new "x"=> "x"irb(main):002:0> String.new("x")=> "x"irb(main):003:0> String.new( "x" )=> "x"irb(main):004:0> String.new ("x")=> "x"

Page 49: Why everyone like ruby

irb(main):005:0> [String.new("x")]

Page 50: Why everyone like ruby

irb(main):005:0> [String.new("x")]=> ["x"]

Page 51: Why everyone like ruby

irb(main):005:0> [String.new("x")]=> ["x"]irb(main):006:0> [String.new ("x")]

Page 52: Why everyone like ruby

irb(main):005:0> [String.new("x")]=> ["x"]irb(main):006:0> [String.new ("x")]SyntaxError: (irb):25: syntax error, unexpected ( arg, expecting ']'[String.new ("x")]^ (irb):25: syntax error, unexpected ']', expecting end-of-inputfrom /usr/bin/irb:12:in `<main>'# Пробелы

Page 53: Why everyone like ruby

irb(main):001:0> %w(rm -rf /home)

Page 54: Why everyone like ruby

irb(main):001:0> %w(rm -rf /home)=> ["rm", "-rf", "/home"]

Page 55: Why everyone like ruby

irb(main):001:0> %w(rm -rf /home)=> ["rm", "-rf", "/home"]irb(main):002:0> %i(rm -rf /home)

Page 56: Why everyone like ruby

irb(main):001:0> %w(rm -rf /home)=> ["rm", "-rf", "/home"]irb(main):002:0> %i(rm -rf /home)=> [:rm, :"-rf", :"/home"]

Page 57: Why everyone like ruby

irb(main):001:0> %w(rm -rf /home)=> ["rm", "-rf", "/home"]irb(main):002:0> %i(rm -rf /home)=> [:rm, :"-rf", :"/home"]irb(main):003:0> %x(rm -rf /home)

Page 58: Why everyone like ruby

irb(main):001:0> %w(rm -rf /home)=> ["rm", "-rf", "/home"]irb(main):002:0> %i(rm -rf /home)=> [:rm, :"-rf", :"/home"]irb(main):003:0> %x(rm -rf /home)=> ""

# это еще хорошо у меня OSX

Page 59: Why everyone like ruby

irb(main):001:0> {foo: 1}=> {:foo=>1}

Page 60: Why everyone like ruby

irb(main):001:0> {foo: 1}=> {:foo=>1}irb(main):002:0> {:foo => 1}=> {:foo=>1}

Page 61: Why everyone like ruby

irb(main):001:0> {foo: 1}=> {:foo=>1}irb(main):002:0> {:foo => 1}=> {:foo=>1}irb(main):003:0> {"foo" => 1}=> {"foo"=>1}

Page 62: Why everyone like ruby

irb(main):005:0> {:foo => 1}["foo"]

Page 63: Why everyone like ruby

irb(main):005:0> {:foo => 1}["foo"]=> nil

Page 64: Why everyone like ruby

irb(main):005:0> {:foo => 1}["foo"]=> nilirb(main):006:0> {:foo => 1}["foo".to_sym]

Page 65: Why everyone like ruby

irb(main):005:0> {:foo => 1}["foo"]=> nilirb(main):006:0> {:foo => 1}["foo".to_sym]=> 1

# зато метод без скобок вызван

Page 66: Why everyone like ruby

irb(main):001:0> h = {:foo => 1}=> {:foo=>1}

Page 67: Why everyone like ruby

irb(main):001:0> h = {:foo => 1}=> {:foo=>1}irb(main):002:0> h = h.with_indifferent_access=> {"foo"=>1}

Page 68: Why everyone like ruby

irb(main):001:0> h = {:foo => 1}=> {:foo=>1}irb(main):002:0> h = h.with_indifferent_access=> {"foo"=>1}irb(main):003:0> h["foo"]

Page 69: Why everyone like ruby

irb(main):001:0> h = {:foo => 1}=> {:foo=>1}irb(main):002:0> h = h.with_indifferent_access=> {"foo"=>1}irb(main):003:0> h["foo"]=> 1

Page 70: Why everyone like ruby

irb(main):001:0> h = {:foo => 1}=> {:foo=>1}irb(main):002:0> h = h.with_indifferent_access=> {"foo"=>1}irb(main):003:0> h["foo"]=> 1irb(main):004:0> h[:foo]

Page 71: Why everyone like ruby

irb(main):001:0> h = {:foo => 1}=> {:foo=>1}irb(main):002:0> h = h.with_indifferent_access=> {"foo"=>1}irb(main):003:0> h["foo"]=> 1irb(main):004:0> h[:foo]=> 1

# доступно только в rails

Page 72: Why everyone like ruby

irb(main):001:0> h = {:foo => 1}=> {:foo=>1}irb(main):002:0> h = h.with_indifferent_access=> {"foo"=>1}irb(main):003:0> h["foo"]=> 1irb(main):004:0> h[:foo]=> 1

# доступно только в rails# ruby DSL для rails

Page 73: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'end

foo do |value| puts valueend

Page 74: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'end

foo do |value| puts valueend

> open resource4142close resource

Page 75: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'end

foo do |value| puts value breakend

Page 76: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'end

foo do |value| puts value breakend

> open resource41

Page 77: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'enddef has_answer? foo do |value| return true if value == 42 endendputs has_answer?

Page 78: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'enddef has_answer? foo do |value| return true if value == 42 endendputs has_answer?

> open resourcetrue

Page 79: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'enddef has_answer? rc = false foo {|value| rc = true if value == 42} rcendputs has_answer?

Page 80: Why everyone like ruby

def foo(&block) puts 'open resource' [*41..42].each &block.method(:call) puts 'close resource'enddef has_answer? rc = false foo {|value| rc = true if value == 42} rcendputs has_answer?

> open resourceclose resourcetrue

Page 81: Why everyone like ruby

module Foo def bar puts 'hi' endend

irb(main):009:0* Foo.bar

Page 82: Why everyone like ruby

module Foo def bar puts 'hi' endend

irb(main):009:0* Foo.barNoMethodError: undefined method `bar' for Foo:Module from (irb):9 from /usr/bin/irb:12:in `<main>'

Page 83: Why everyone like ruby

module Foo module_function def bar puts 'hi' endend

irb(main):010:0* Foo.barhi

Page 84: Why everyone like ruby

module Foo BAZ = 'hey' module_function def bar puts 'hi' endend

Page 85: Why everyone like ruby

module Foo BAZ = 'hey' module_function def bar puts 'hi' endend

irb(main):096:0> Foo::bar

Page 86: Why everyone like ruby

module Foo BAZ = 'hey' module_function def bar puts 'hi' endend

irb(main):096:0> Foo::barhi=> nil

Page 87: Why everyone like ruby

module Foo BAZ = 'hey' module_function def bar puts 'hi' endend

irb(main):096:0> Foo::barhi=> nilirb(main):097:0> Foo::BAZ

Page 88: Why everyone like ruby

module Foo BAZ = 'hey' module_function def bar puts 'hi' endend

irb(main):096:0> Foo::barhi=> nilirb(main):097:0> Foo::BAZ=> "hey"

Page 89: Why everyone like ruby

module Foo BAZ = 'hey' module_function def bar puts 'hi' endend

irb(main):096:0> Foo::barhi=> nilirb(main):097:0> Foo::BAZ=> "hey"irb(main):098:0> Foo.baz

Page 90: Why everyone like ruby

module Foo BAZ = 'hey' module_function def bar puts 'hi' endend

irb(main):096:0> Foo::barhi=> nilirb(main):097:0> Foo::BAZ=> "hey"irb(main):098:0> Foo.bazNoMethodError: undefined method `baz' for Foo:Module from (irb):98 from /usr/bin/irb:12:in `<main>'# почему нет?

Page 91: Why everyone like ruby

В качестве заключения, что с популярностью ruby?

Page 92: Why everyone like ruby

http://githut.info/

Page 93: Why everyone like ruby

http://pypl.github.io/PYPL.html

Page 94: Why everyone like ruby

http://stackoverflow.com/jobs

Page 95: Why everyone like ruby

Спасибо за внимание