Ruby

1,832 views
1,729 views

Published on

Published in: Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,832
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
40
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Ruby

    1. 1. Ruby Masterclass Kerry Buckley 16 June 2011
    2. 2. History• Created in 1993• First public release Christmas 1995• ‘Pickaxe’ book first published in 2001• Ruby on Rails released in 2005
    3. 3. Philosophy“I wanted a scripting language that wasmore powerful than Perl, and more object-oriented than Python. That’s why I decidedto design my own language” — Yukihiro ‘Matz’ Matsumoto
    4. 4. Philosophy“I hope to see Ruby help everyprogrammer in the world to be productive,and to enjoy programming, and to behappy. That is the primary purpose ofRuby language.” — Yukihiro ‘Matz’ Matsumoto
    5. 5. Characteristics• Strongly but dynamically typed• Interpreted• Object-oriented• …but can be procedural• …or even (mostly) functional• Concise but readable
    6. 6. Applications• Web apps• Shell scripting• Build automation• Deployment automation• ‘Glue’ code
    7. 7. Culture• Permissive open source (MIT)• Favour simplicity• Agile (especially TDD)• Mac/Linux• Fast-moving• Fun!
    8. 8. Basic syntax
    9. 9. puts "hello world"
    10. 10. Variables$global_variable = 123@@class_variable = "hello"@instance_variable = [1, 2, 3]local_variable = true
    11. 11. Built-in types421.5"string":symbol[1, 2, "foo"]{1 => "one", 2 => "two"}(1..10)/^foo.*$/truefalsenil
    12. 12. Classes & methodsclass MyClass def initialize number @number = number end def double @number * 2 end def hello(name = "world") puts "Hello #{name.capitalize}" endendmy_object = MyClass.new(2)puts my_object.double #=> prints "4"my_object.hello #=> prints "hello World"my_object.hello "kerry" #=> prints "hello Kerry"
    13. 13. Accessors
    14. 14. Accessorsclass Rectangle attr_accessor :x attr_reader :y def initialize x, y @x, @y = x, y endend
    15. 15. Accessorsclass Rectangle attr_accessor :x attr_reader :y def initialize x, y @x, @y = x, y endendrect = Rectangle.new 2, 4rect.x #=> 2rect.y #=> 4
    16. 16. Accessorsclass Rectangle attr_accessor :x attr_reader :y def initialize x, y @x, @y = x, y endendrect = Rectangle.new 2, 4rect.x #=> 2rect.y #=> 4rect.x = 3rect.x #=> 3
    17. 17. Accessorsclass Rectangle attr_accessor :x attr_reader :y def initialize x, y @x, @y = x, y endendrect = Rectangle.new 2, 4rect.x #=> 2rect.y #=> 4rect.x = 3rect.x #=> 3rect.y = 3 #=> NoMethodError
    18. 18. if, else and unless
    19. 19. if, else and unlessif a == b puts "The same"elsif a < b puts "A is lower"else puts "A is higher"end
    20. 20. if, else and unlessif a == b puts "The same"elsif a < b puts "A is lower"else puts "A is higher"endunless finished? do_stuffend
    21. 21. if, else and unlessif a == b puts "The same"elsif a < b puts "A is lower"else puts "A is higher"endunless finished? do_stuffendraise "Oops" if result.nil?
    22. 22. casecase foowhen nil puts "foo is nil"when /^a/i puts "foo begins with an A"when String puts "foo is a string"when (1..10) puts "foo is in the range 1-10"else puts "foo is something else"end
    23. 23. Loopsfor a in (1..10) do puts aendb=0while b <= 10 puts b b += 1end
    24. 24. Including other code• load• require• Rubygems
    25. 25. Exercise 1 Playing with irb
    26. 26. Everything is an object42.class #=> FixnumFixnum.class #=> Classnil.class #=> NilClasstrue.class #=> TrueClassmethod(:puts).class #=> Method
    27. 27. Duck typingclass Duck def quack "Quack" endendclass Dog def quack "Woof" endendfor animal in [Duck.new, Dog.new] do puts animal.quackend"a string".quack #=> NoMethodError
    28. 28. Dynamic typingfoo = 123foo.class #=> Fixnumfoo = "foo"foo.class #=> String
    29. 29. Open classesputs 123 #=> "123"class Fixnum def to_s "Not telling you!" endendputs 123 #=> "Not telling you!"
    30. 30. Open classesputs 123 #=> "123"class Fixnum def to_s "Not telling you!" endendputs 123 #=> "Not telling you!" You probably don’t want to do this.
    31. 31. Aliasing methodsrequire "fileutils"class << FileUtils def rm_with_prompt *files print "Are you sure you want to delete #{files}? " response = gets.chomp.downcase return unless %w{yes y}.include?(response) rm_without_prompt *files end alias_method :rm_without_prompt, :rm alias_method :rm, :rm_with_promptendFileUtils.rm "a_file"
    32. 32. Blocks
    33. 33. Blocksbegin puts "This is a block, but its not much use"end
    34. 34. Blocksbegin puts "This is a block, but its not much use"endblock = Proc.new do puts "Now Im assigned to a variable"end# Nothing printed yet
    35. 35. Blocksbegin puts "This is a block, but its not much use"endblock = Proc.new do puts "Now Im assigned to a variable"end# Nothing printed yetblock.call #=> executes the block
    36. 36. Blocksbegin puts "This is a block, but its not much use"endblock = Proc.new do puts "Now Im assigned to a variable"end# Nothing printed yetblock.call #=> executes the blockProc.new { puts "curly brackets work too" }
    37. 37. Blocks with argumentsblock = Proc.new do |arg| puts "You called me with #{arg.inspect}"endblock.call("foo") #=> You called me with "foo"
    38. 38. Explicit block argsdef n_times(n, &block) puts "starting..." n.times { block.call } puts "done."endn_times(3) do puts "hello"end#=> starting...#=> hello#=> hello#=> hello#=> done.
    39. 39. Implicit block argsdef n_times(n) puts "starting..." n.times { yield } puts "done."endn_times(3) do puts "hello"end#=> starting...#=> hello#=> hello#=> hello#=> done.
    40. 40. File IO with blocks
    41. 41. File IO with blocksfile = File.open "logfile", "a"file.puts "log message"file.close
    42. 42. File IO with blocksfile = File.open "logfile", "a"file.puts "log message"file.closeFile.open "logfile", "a" do |file| file.puts "log message"end
    43. 43. Modules
    44. 44. Modulesmodule InfoDisplay def display_info puts "Class: #{self.class}, ID: #{object_id}" endendclass SomeClass include InfoDisplayendSomeClass.new.display_info #=> "Class: SomeClass, ID: 2159853660"
    45. 45. Modulesmodule InfoDisplay def display_info puts "Class: #{self.class}, ID: #{object_id}" endendclass SomeClass include InfoDisplayendSomeClass.new.display_info #=> "Class: SomeClass, ID: 2159853660"String.send :include, InfoDisplay"foo".display_info #=> "Class: String, ID: 2159853520"
    46. 46. Modules: Enumerableclass Words include Enumerable def initialize string @words = string.split end def each @words.each {|word| yield word } endendwords = Words.new("The quick brown fox")puts words.first #=> "The"puts words.count #=> 4p words.select{|w| w.length == 3 } # => ["The", "fox"]
    47. 47. Exercise 2Working with Enumerable
    48. 48. Metaprogramming• Programs writing programs• Modify behaviour at runtime• Generate code• Respond dynamically to messages
    49. 49. Evaluating code
    50. 50. Evaluating codecode = puts "hello"eval code #=> "hello"
    51. 51. Evaluating codecode = puts "hello"eval code #=> "hello"foo = "Ruby"foo.instance_eval do def hello puts "Hello, Im #{self}" endendfoo.hello #=> "Hello, Im Ruby"
    52. 52. Dynamic calling
    53. 53. Dynamic callingfoo = "Hello"foo.upcase #=> "HELLO"foo.send :upcase #=> "HELLO"
    54. 54. Dynamic callingfoo = "Hello"foo.upcase #=> "HELLO"foo.send :upcase #=> "HELLO"method = [:upcase, :downcase][rand(2)]foo.send method #=> Randomly "HELLO" or "hello"
    55. 55. Dynamic callingfoo = "Hello"foo.upcase #=> "HELLO"foo.send :upcase #=> "HELLO"method = [:upcase, :downcase][rand(2)]foo.send method #=> Randomly "HELLO" or "hello"bar = 2bar.send :+, 2 #=> 4
    56. 56. Dynamic responseclass Foo def method_missing name, *args puts "You called #{name} with #{args.inspect}" endendFoo.new.bar(1, "hello") #=> You called bar with [1, "hello"]
    57. 57. Exercise 3 Metaprogramming
    58. 58. Rakerequire "erb"require "rake/clean"CLOBBER.include("output/*")OUTPUT_FILE = "output/README.txt"TEMPLATE_FILE = "templates/README.txt.erb"desc "Build the README file from the template"file OUTPUT_FILE => TEMPLATE_FILE do template = File.read(TEMPLATE_FILE) File.open(OUTPUT_FILE, "w") do |f| output = ERB.new(template).result(binding) f.write output endendtask :default => [OUTPUT_FILE]
    59. 59. Exercise 4 Rake
    60. 60. Web frameworks and many more…
    61. 61. Web serversMongrel CGI Webrick
    62. 62. Before Rack
    63. 63. Before Rack
    64. 64. Before Rack
    65. 65. Before Rack
    66. 66. Before Rack
    67. 67. With RackRack-compliant interface
    68. 68. A rack apprequire "rack"class HelloWorld def call env [200, {"Content-Type" => "text/plain"}, StringIO.new("Hello world")] endendrun HelloWorld.new
    69. 69. Exercise 5 Rack
    70. 70. Shell scripting#!/usr/bin/env rubyrequire "fileutils"include FileUtilsARGV.each do |file| cp file, "#{file}.bak"endsystem "service httpd restart" #=> returns true or falseusers = `users`.split
    71. 71. Testing• Test/Unit & SimpleTest• RSpec• Cucumber• Capybara
    72. 72. JRuby• Another implementation of Ruby• Written in Java• Comparable or better performance• Use Java libraries from Ruby code• Deploy Rails apps as WAR files
    73. 73. Calling Java from Rubyrequire javaframe = javax.swing.JFrame.new "Window"label = javax.swing.JLabel.new "Hello"frame.getContentPane.add labelframe.setDefaultCloseOperation( javax.swing.JFrame::EXIT_ON_CLOSE)frame.packframe.setVisible true
    74. 74. Calling Ruby from Javaimport org.jruby.embed.ScriptingContainer;public class HelloWorld { private HelloWorld() { ScriptingContainer c = new ScriptingContainer(); c.runScriptlet("puts "Hello World!""); } public static void main(String[] args) { new HelloWorld(); }}
    75. 75. while Time.now.hour < 17 audience_suggestions.pop.discussendgo :home

    ×