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

Why everyone likes ruby

Jan 22, 2018

Download

Engineering

Yuri Khrustalev
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 likes ruby

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

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

Page 2: Why everyone likes ruby

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

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

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

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

* конечно нет

Page 3: Why everyone likes ruby

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

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

● Wat?

https://www.destroyallsoftware.com/talks/wat

Page 4: Why everyone likes ruby

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

Page 5: Why everyone likes ruby

class Foo

def initialize

puts 'hi'

end

end

Page 6: Why everyone likes ruby

class Foo

def initialize

puts 'hi'

end

end

Foo.new

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

Page 7: Why everyone likes ruby

irb(main):001:0> bool

Page 8: Why everyone likes ruby

irb(main):001:0> bool

NameError: undefined local variable or method

`bool' for main:Object

from (irb):1

from /usr/bin/irb:12:in `<main>'

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

Page 9: Why everyone likes ruby

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

Page 10: Why everyone likes ruby

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

NoMethodError: undefined method `to_b' for

"":String

from (irb):1

from /usr/bin/irb:12:in `<main>'

# Где метод у объекта, это же ООП язык?

Page 11: Why everyone likes ruby

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

Page 12: Why everyone likes ruby

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

(irb):2: warning: string literal in condition

=> true

# Почему warning?

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

Page 13: Why everyone likes ruby

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

(irb):2: warning: string literal in condition

=> true

# Почему warning?

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

# Почему оно true?

Page 14: Why everyone likes ruby

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

Page 15: Why everyone likes ruby

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

=> true

Page 16: Why everyone likes ruby

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

=> true

irb(main):005:0> !![]

Page 17: Why everyone likes ruby

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

=> true

irb(main):005:0> !![]

=> true

Page 18: Why everyone likes ruby

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

=> true

irb(main):005:0> !![]

=> true

irb(main):006:0> !!Object.new

Page 19: Why everyone likes ruby

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

=> true

irb(main):005:0> !![]

=> true

irb(main):006:0> !!Object.new

=> true

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

Page 20: Why everyone likes ruby

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

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

=> true

Page 21: Why everyone likes ruby

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

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

=> true

irb(main):002:0> [].blank?

Page 22: Why everyone likes ruby

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

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

=> true

irb(main):002:0> [].blank?

=> true

Page 23: Why everyone likes ruby

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

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

=> true

irb(main):002:0> [].blank?

=> true

irb(main):003:0> nil.blank?

Page 24: Why everyone likes ruby

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

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

=> true

irb(main):002:0> [].blank?

=> true

irb(main):003:0> nil.blank?

=> true

Page 25: Why everyone likes ruby

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

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

=> true

irb(main):002:0> [].blank?

=> true

irb(main):003:0> nil.blank?

=> true

irb(main):004:0> 0.blank?

Page 26: Why everyone likes ruby

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

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

=> true

irb(main):002:0> [].blank?

=> true

irb(main):003:0> nil.blank?

=> true

irb(main):004:0> 0.blank?

=> false

Page 27: Why everyone likes ruby

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

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

=> true

irb(main):002:0> [].blank?

=> true

irb(main):003:0> nil.blank?

=> true

irb(main):004:0> 0.blank?

=> false

# нормально же общались

Page 28: Why everyone likes ruby

# Python

>>> arr = [1, 2, 3]

>>> map(str, arr)

["1", "2", "3"]

Page 29: Why everyone likes ruby

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

=> [1, 2, 3]

Page 30: Why everyone likes 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 likes 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 likes ruby

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

=> ["1", "2", "3"]

Page 33: Why everyone likes ruby

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

=> ["1", "2", "3"]

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

Page 34: Why everyone likes 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 likes ruby

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

Page 36: Why everyone likes ruby

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

=> ["1", "2", "3"]

# это удобно

Page 37: Why everyone likes ruby

# chain.rb

x =

' foo bar '

.strip

.split(' ')

puts x.to_s

Page 38: Why everyone likes ruby

# chain.rb

x =

' foo bar '

.strip

.split(' ')

puts x.to_s

irb(main):001:0> load './chain.rb'

[1, 2]

=> nil

Page 39: Why everyone likes ruby

# chain.rb

x =

' foo bar '

#.strip

.split(' ')

puts x.to_s

Page 40: Why everyone likes 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):15

from /usr/bin/irb:12:in `<main>'

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

Page 41: Why everyone likes ruby

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

Page 42: Why everyone likes ruby

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

=> "x"

Page 43: Why everyone likes ruby

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

=> "x"

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

Page 44: Why everyone likes ruby

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

=> "x"

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

=> "x"

Page 45: Why everyone likes 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 likes 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 likes 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 likes 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 likes ruby

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

Page 50: Why everyone likes ruby

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

=> ["x"]

Page 51: Why everyone likes ruby

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

=> ["x"]

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

Page 52: Why everyone likes 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-input

from /usr/bin/irb:12:in `<main>'

# Пробелы

Page 53: Why everyone likes ruby

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

Page 54: Why everyone likes ruby

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

=> ["rm", "-rf", "/home"]

Page 55: Why everyone likes ruby

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

=> ["rm", "-rf", "/home"]

irb(main):002:0> %i(rm -rf /home)

Page 56: Why everyone likes 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 likes 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 likes 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 likes ruby

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

=> {:foo=>1}

Page 60: Why everyone likes ruby

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

=> {:foo=>1}

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

=> {:foo=>1}

Page 61: Why everyone likes 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 likes ruby

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

Page 63: Why everyone likes ruby

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

=> nil

Page 64: Why everyone likes ruby

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

=> nil

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

Page 65: Why everyone likes ruby

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

=> nil

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

=> 1

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

Page 66: Why everyone likes ruby

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

=> {:foo=>1}

Page 67: Why everyone likes 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 likes 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 likes 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 likes 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

irb(main):004:0> h[:foo]

Page 71: Why everyone likes 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

irb(main):004:0> h[:foo]

=> 1

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

Page 72: Why everyone likes 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

irb(main):004:0> h[:foo]

=> 1

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

# ruby DSL для rails

Page 73: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

foo do |value|

puts value

end

Page 74: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

foo do |value|

puts value

end

> open resource

41

42

close resource

Page 75: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

foo do |value|

puts value

break

end

Page 76: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

foo do |value|

puts value

break

end

> open resource

41

Page 77: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

def has_answer?

foo do |value|

return true if value == 42

end

end

puts has_answer?

Page 78: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

def has_answer?

foo do |value|

return true if value == 42

end

end

puts has_answer?

> open resource

true

Page 79: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

def has_answer?

rc = false

foo {|value| rc = true if value == 42}

rc

end

puts has_answer?

Page 80: Why everyone likes ruby

def foo(&block)

puts 'open resource'

[*41..42].each &block.method(:call)

puts 'close resource'

end

def has_answer?

rc = false

foo {|value| rc = true if value == 42}

rc

end

puts has_answer?

> open resource

close resource

true

Page 81: Why everyone likes ruby

module Foo

def bar

puts 'hi'

end

end

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

Page 82: Why everyone likes ruby

module Foo

def bar

puts 'hi'

end

end

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

NoMethodError: undefined method `bar' for

Foo:Module

from (irb):9

from /usr/bin/irb:12:in `<main>'

Page 83: Why everyone likes ruby

module Foo

module_function

def bar

puts 'hi'

end

end

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

hi

Page 84: Why everyone likes ruby

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

Page 85: Why everyone likes ruby

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

Page 86: Why everyone likes ruby

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

hi

=> nil

Page 87: Why everyone likes ruby

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

hi

=> nil

irb(main):097:0> Foo::BAZ

Page 88: Why everyone likes ruby

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

hi

=> nil

irb(main):097:0> Foo::BAZ

=> "hey"

Page 89: Why everyone likes ruby

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

hi

=> nil

irb(main):097:0> Foo::BAZ

=> "hey"

irb(main):098:0> Foo.baz

Page 90: Why everyone likes ruby

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

hi

=> nil

irb(main):097:0> Foo::BAZ

=> "hey"

irb(main):098:0> Foo.baz

NoMethodError: undefined

method `baz' for Foo:Module

from (irb):98

from /usr/bin/irb:12:in

`<main>'

# почему нет?

Page 91: Why everyone likes ruby

В качестве заключения, что с

популярностью ruby?

Page 92: Why everyone likes ruby

http://githut.info/

Page 93: Why everyone likes ruby

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

Page 94: Why everyone likes ruby

http://stackoverflow.com/jobs

Page 95: Why everyone likes ruby

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