Upload
yuri-khrustalev
View
144
Download
0
Embed Size (px)
Citation preview
Почему все так любят
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
Спасибо за внимание