Slide 1

Slide 1 text

Ruby.new INTRODUCTION TO RUBY Thursday, February 28, 13

Slide 2

Slide 2 text

Thursday, February 28, 13

Slide 3

Slide 3 text

Thursday, February 28, 13

Slide 4

Slide 4 text

Thursday, February 28, 13

Slide 5

Slide 5 text

Thursday, February 28, 13

Slide 6

Slide 6 text

Thursday, February 28, 13

Slide 7

Slide 7 text

jakefolio http://jakefolio.com [email protected] Jake Smith Thursday, February 28, 13

Slide 8

Slide 8 text

http://bit.ly/YKoi0z Links and Resources Thursday, February 28, 13

Slide 9

Slide 9 text

History 1 Thursday, February 28, 13

Slide 10

Slide 10 text

http://www.flickr.com/photos/rrrodrigo/2393323487/ Yukihiro Matsumoto SmallTalk Perl LISP Python Created Ruby in 1995 in Japan. The first english speaking user group was not created until Ruby 1.3 (1999) Thursday, February 28, 13

Slide 11

Slide 11 text

Ruby 2 Thursday, February 28, 13

Slide 12

Slide 12 text

Everything is an Object Thursday, February 28, 13

Slide 13

Slide 13 text

Everything.... "Hello World".class # => String 5.class # => Fixnum 5000000000000000000.class # => Bignum 3.14.class # => Float nil.class # => NilClass true.class # => TrueClass false.class # => FalseClass WAT? Thursday, February 28, 13

Slide 14

Slide 14 text

Variables foo_bar # => Local Variable Foobar # => Constant @foo_bar # => Instance Variable @@foo_bar # => Class Variable $foo_bar # => Global Variable Thursday, February 28, 13

Slide 15

Slide 15 text

Conventions Thursday, February 28, 13

Slide 16

Slide 16 text

current_user = User.find(1) random_ids = [2,6,4,6,36,67,77,5,4] random_ids.uniq random_ids # => [2, 6, 4, 6, 36, 67, 77, 5, 4] random_ids.uniq! random_ids # => [2, 6, 4, 36, 67, 77, 5] random_ids.include? 4 # => true Lower case and _ seperated Modify in place Expect a boolean response Thursday, February 28, 13

Slide 17

Slide 17 text

Data Types 3 Thursday, February 28, 13

Slide 18

Slide 18 text

String "Grumpy wizards make toxic brew" # => Grumpy wizards make toxic brew subject + " make toxic brew" # => Grumpy wizards make toxic brew "#{subject} make toxic brew" # => Grumpy wizards make toxic brew '#{subject} make toxic brew' # => #{subject} make toxic brew content = <

Slide 19

Slide 19 text

String "Grumpy wizards make toxic brew".length # => 30 "Grumpy wizards make toxic brew".reverse # => "werb cixot ekam sdraziw ypmurG" "Grumpy wizards make toxic brew".upcase # => "GRUMPY WIZARDS MAKE TOXIC BREW" "".methods # => Shows all methods available to String, too many to list ;) Thursday, February 28, 13

Slide 20

Slide 20 text

Number 0xfff # => 4095 1.0e-05 "%f" % 1.0e-5 # => "0.000010" 5 ** 5 # => 3125 128 / 10 # => 12 Where’s my remainder? String Formatting Thursday, February 28, 13

Slide 21

Slide 21 text

Number (128 / 10).to_f # => 12.0 128.0 / 10 # => 12.8 128.to_f / 10 # => 12.8 Thursday, February 28, 13

Slide 22

Slide 22 text

Range (1..100).each { |v| puts v } # => 1, 2, 3, 4...97, 98, 99, 100 # (1...100).each { |v| puts v } # => 2, 3, 4, 5...96, 97, 98, 99 (1...100).to_a.include? 100 # => false ('a'..'z').each { |v| puts v } # => a, b, c....x, y, z ('a'..'z').covers?('e') # => true Thursday, February 28, 13

Slide 23

Slide 23 text

Regex username = "jsmith92@" match_username = Regexp.new('/^[a-zA-Z0-9_]+$/') match_username = /^[a-zA-Z0-9_]+$/ username.match match_username # => nil username = "jsmith92" username.match match_username # => # find_date = "The conference is taking place on 2013-02-01" find_date =~ /\d{4}-\d{1,2}-\d{1,2}/ # => 34 Thursday, February 28, 13

Slide 24

Slide 24 text

Regex content = "Welcome to an intro of PHP. PHP the greatest language EVAR!" content.sub('PHP', 'Ruby') # => "Welcome to an intro of Ruby. PHP the greatest language EVAR!" content.gsub('PHP', 'Ruby') # => "Welcome to an intro of Ruby. Ruby the greatest language EVAR!" content.gsub(/php/i, 'Ruby') # => "Welcome to an intro of Ruby. Ruby the greatest language EVAR!" Thursday, February 28, 13

Slide 25

Slide 25 text

Symbols user = { :username => 'jdoe' } user[:username] # => "jdoe" "get".to_sym # => :get :username.object_id # => 458088 user2 = { :username => 'jsmith' } :username.object_id # => 458088 It’s a String! Not Really Thursday, February 28, 13

Slide 26

Slide 26 text

Array greeting = Array.new greeting = [] greeting.push 'Hello' # => ["Hello"] greeting << 'Confoo' # => ["Hello", "Confoo"] greeting.join(' ') # => "Hello Confoo" %w(Hello Confoo Attendees) # => ["Hello", "Confoo", "Attendees"] ["Hello", "Confoo", [1, 2, 3]].flatten # => ["Hello", "Confoo", 1, 2, 3] Perl inspired Alternate Notation Thursday, February 28, 13

Slide 27

Slide 27 text

Hash user = { :name => 'Jake', :location => [32.7828, 96.8039] } puts user[:name] # => Jake puts user[:random] # => nil user = Hash.new 'Oh noes I\'m empty' puts user # => {} user[:username] # => "Oh noes I'm empty" user.empty? # => true Thursday, February 28, 13

Slide 28

Slide 28 text

Hash New in Ruby 1.9 current_user = { :first_name => 'Jake', :last_name => 'Smith', :username => 'jsmith' } current_user = { first_name: 'Jake', last_name: 'Smith', username: 'jsmith' } current_user.first # => [:first_name, "Jake"] New JSON Inspired Format Order Maintained Thursday, February 28, 13

Slide 29

Slide 29 text

Conditionals and Loops 4 Thursday, February 28, 13

Slide 30

Slide 30 text

Conditionals if @post.published? and @post.approved? # Show the post else # DO NOT show post end unless @user.access? # Access Denied end if [email protected]? # Access Denied end if format == 'xml' # Base output on XML elsif format == 'json' # Do some JSON Hotness end @reservation.save if @location.available? redirect_to users_path and return unless @user.save Same Conditional Thursday, February 28, 13

Slide 31

Slide 31 text

Conditionals if "" puts "Empty String Works" end if 0 puts "Zero Works" end if nil puts "Nil Works" end if false puts "False Works" end Thursday, February 28, 13

Slide 32

Slide 32 text

Conditionals case ranking when 1..3 puts "You're at an elite level" when 4..10 puts "You made it to the second round!" else puts "Better luck next year!" end Thursday, February 28, 13

Slide 33

Slide 33 text

Iterations users = [ { name: 'John', username: 'jdoe' }, { name: 'Jane', username: 'jadoe' }, { name: 'Jake', username: 'jsmith' } ] users.each do |user| puts user[:name] end users.each_with_index do |user, index| puts "[#{index}] #{user[:name]}" end user = "Random User Variable" for user in users puts user[:name] end puts user # => {:name=>"Jake", :username=>"jsmith"} User is still defined? Thursday, February 28, 13

Slide 34

Slide 34 text

Looping 3.times { puts "Hello World" } # => Hello World # => Hello World # => Hello World bottles = 99 while bottles > 0 # take one down pass it... puts bottles.to_s + " bottles of beer on the wall" bottles -= 1 end until file.eof? # Work with line content end Thursday, February 28, 13

Slide 35

Slide 35 text

Blocks, Procs, and Lambdas 5 Thursday, February 28, 13

Slide 36

Slide 36 text

Blocks in the Wild squared = [1,2,3,4].map do |element| element ** 2 end puts squared.join(', ') # => 1, 4, 9, 16 Thursday, February 28, 13

Slide 37

Slide 37 text

class Array def square!(&block) self.each_with_index do |value, index| self[index] = yield(value) end self end end my_numbers = [1,2,3,4] my_numbers.square! do |element| element ** 2 end puts my_numbers.join(', ') # => 1, 4, 9, 16 Thursday, February 28, 13

Slide 38

Slide 38 text

Block Proc Lambda Thursday, February 28, 13

Slide 39

Slide 39 text

Procs and Lambdas def test_proc Proc.new { return "Hey look I'm a Proc" }.call "Finished Proc Test" end def test_lambda lambda { return "Hey look I'm a Lambda" }.call "Finished Lambda Test" end puts test_proc # => Hey look I'm a Proc puts test_lambda # => Finished Lambda Test Y U NO FINISH? Thursday, February 28, 13

Slide 40

Slide 40 text

Classes 6 Thursday, February 28, 13

Slide 41

Slide 41 text

Creating a class class Asset def initialize(path) @path = path @dimensions = [32, 20] end end image = Asset.new('/images/hello.jpg') Thursday, February 28, 13

Slide 42

Slide 42 text

Accessors class Asset attr_accessor :dimensions attr_reader :path def initialize(path) @path = path @dimensions = [32, 20] end end image = Asset.new('/images/hello.jpg') puts image.dimensions.join('x') # => 32x20 Thursday, February 28, 13

Slide 43

Slide 43 text

Accessors Gotcha class User attr_accessor :name attr_reader :permissions def initialize(name, *permissions) @name, @permissions = name, permissions end end current_user = User.new('jake', 'manage.users', 'manage.assets')] puts current_user.permissions.join(', ') # => manage.users, manage.assets current_user.permissions << 'manage.posts' puts current_user.permissions.join(', ') # => manage.users, manage.assets, manage.posts Thursday, February 28, 13

Slide 44

Slide 44 text

Methods class Asset attr_accessor :dimensions, :path def initialize(path) @path = path @dimensions = [32, 20] end def width @dimensions[0] end def height @dimensions[1] end def square? width == height end end image = Asset.new('/images/hello.jpg') puts "I'm No Square" unless image.square? Thursday, February 28, 13

Slide 45

Slide 45 text

Public, Protected, Private class Asset attr_accessor :dimensions, :path def initialize(path) @path = path @dimensions = [32, 20] end def square? width == height end protected def get_type # get class type end end image.get_type # => protected method `get_type' called for # (NoMethodError) Thursday, February 28, 13

Slide 46

Slide 46 text

Inheritance class Image < Asset def get_mime "image/jpeg" end end class Video < Asset def fps 30 end end image = Image.new('/images/new.jpg') puts image.dimensions.join('x') # => 32x20 puts image.get_mime # => “image/jpeg” Thursday, February 28, 13

Slide 47

Slide 47 text

Modules Mixins 7 Thursday, February 28, 13

Slide 48

Slide 48 text

Creating Module module HTML5 def render asset_type = self.get_type "HTML GOES HERE" end end module Taggable def slug self.title.gsub(' ', '-') end end Thursday, February 28, 13

Slide 49

Slide 49 text

Namespacing module Output module HTML5 def render asset_type = self.get_type "HTML GOES HERE" end end end class Admin::AlbumsController < ApplicationController restrict_to_permission :edit_pages, :except => [ :index, :show ] before_filter :login_required, :only => [ :index, :show ] def users ::User.findByAlbum(self.id) end end Global Namespace Thursday, February 28, 13

Slide 50

Slide 50 text

Applying mixin module SumMixin def sum self.inject(:+) end end [4,3,2,1,5,6].sum # => undefined method `sum' for [4, 3, 2, 1, 5, 6]:Array (NoMethodError) Array.send(:include, SumMixin) puts [4,3,2,1,5,6].sum # => 21 Thursday, February 28, 13

Slide 51

Slide 51 text

Applying mixin class Array def sum self.inject(:+) end end class Array include SumMixin end puts [4,3,2,1,5,6].sum # => 21 Thursday, February 28, 13

Slide 52

Slide 52 text

Tools/Libs 8 Thursday, February 28, 13

Slide 53

Slide 53 text

{ frameworks: ['Rails', 'Sinatra'], build: 'Rake', deployment: 'capistrano', library_management: ['gem', 'bundler'] repl: 'irb', versioning: ['rvm', 'rbenv'] } Thursday, February 28, 13

Slide 54

Slide 54 text

Questions? Concerns? Complaints? Thursday, February 28, 13

Slide 55

Slide 55 text

Thanks for Listening jakefolio http://jakefolio.com [email protected] Please Rate Me! https://joind.in/7946 Thursday, February 28, 13