why everyone like ruby

Post on 08-Feb-2017

134 Views

Category:

Engineering

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

class Foo def initialize puts 'hi' endend

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

irb(main):001:0> bool

irb(main):001:0> boolNameError: 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_bNoMethodError: 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> !!{}=> trueirb(main):005:0> !![]

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

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

irb(main):004:0> !!{}=> trueirb(main):005:0> !![]=> trueirb(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'=> trueirb(main):002:0> [].blank?

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

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

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

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

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

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

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

# 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

# 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# нормально же общались

# 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.rbx = ' foo bar ' .strip .split(' ')puts x.to_s

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

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

# chain.rbx = ' 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):15from /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-inputfrom /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"]=> nilirb(main):006:0> {:foo => 1}["foo".to_sym]

irb(main):005:0> {:foo => 1}["foo"]=> nilirb(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"]=> 1irb(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"]=> 1irb(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"]=> 1irb(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 valueend

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

foo do |value| puts valueend

> open resource4142close resource

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

foo do |value| puts value breakend

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

foo do |value| puts value breakend

> open resource41

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?

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

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?

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

module Foo def bar puts 'hi' endend

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

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

module Foo module_function def bar puts 'hi' endend

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

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

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

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

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

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

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

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

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

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

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

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>'# почему нет?

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

http://githut.info/

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

http://stackoverflow.com/jobs

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

top related