why everyone likes ruby

Post on 22-Jan-2018

144 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

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

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

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

* конечно нет

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

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

● Wat?

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

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

class Foo

def initialize

puts 'hi'

end

end

class Foo

def initialize

puts 'hi'

end

end

Foo.new

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

irb(main):001:0> bool

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>'

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

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

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

NoMethodError: undefined method `to_b' for

"":String

from (irb):1

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

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

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

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

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

=> true

# Почему warning?

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

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

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

=> true

# Почему warning?

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

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

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

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

=> true

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

=> true

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

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

=> true

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

=> true

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

=> true

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

=> true

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

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

=> true

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

=> true

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

=> true

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

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

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

=> true

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

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

=> true

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

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

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

=> true

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

=> true

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

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

=> true

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

=> true

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

# 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

# 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?

# 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

# 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

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

# Python

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

>>> map(str, arr)

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

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

=> [1, 2, 3]

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):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"]

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

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

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

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

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

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

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>'

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

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

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

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

# это удобно

# chain.rb

x =

' foo bar '

.strip

.split(' ')

puts x.to_s

# chain.rb

x =

' foo bar '

.strip

.split(' ')

puts x.to_s

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

[1, 2]

=> nil

# chain.rb

x =

' foo bar '

#.strip

.split(' ')

puts x.to_s

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 так не делает

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

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

=> "x"

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

=> "x"

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

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

=> "x"

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

=> "x"

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

=> "x"

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

=> "x"

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

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):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")

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"

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

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

=> ["x"]

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

=> ["x"]

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

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>'

# Пробелы

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

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

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

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

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

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

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

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

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

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

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)

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

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

=> {:foo=>1}

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

=> {:foo=>1}

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

=> {:foo=>1}

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

=> {:foo=>1}

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

=> {:foo=>1}

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

=> {"foo"=>1}

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

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

=> nil

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

=> nil

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

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

=> nil

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

=> 1

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

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

=> {:foo=>1}

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

=> {:foo=>1}

irb(main):002:0> h = h.with_indifferent_access

=> {"foo"=>1}

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"]

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):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]

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

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

def foo(&block)

puts 'open resource'

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

puts 'close resource'

end

foo do |value|

puts value

end

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

def foo(&block)

puts 'open resource'

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

puts 'close resource'

end

foo do |value|

puts value

break

end

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

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?

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

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?

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

module Foo

def bar

puts 'hi'

end

end

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

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>'

module Foo

module_function

def bar

puts 'hi'

end

end

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

hi

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

module Foo

BAZ = 'hey'

module_function

def bar

puts 'hi'

end

end

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

hi

=> nil

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

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"

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

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>'

# почему нет?

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

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

http://githut.info/

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

http://stackoverflow.com/jobs

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

top related