Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Ruby for Java Programmers Mike Bowler President, Gargoyle Software Inc. Mike Bowler — Ruby for Java Programmers Page 1 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Why learn another language? Mike Bowler — Ruby for Java Programmers Page 2 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. History Originated in Japan in 1993 Created by Yukihiro “Matz” Matsumoto First English language book published in 2000 Programming Ruby by Dave Thomas and Andy Hunt (the Pragmatic Programmers) The catalyst, Ruby on Rails, appeared in 2004 Mike Bowler — Ruby for Java Programmers Page 3 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. The Ruby Language Python Smalltalk Perl Lisp Mike Bowler — Ruby for Java Programmers Ruby Page 4 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Sample Code class Sample def print for i in 1..3 puts i end end end sample = Sample.new sample.print Mike Bowler — Ruby for Java Programmers Page 5 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Defining Strong/Weak Typing Strong typing Objects are of a specific type and will not be converted automatically Java: “4”/2 results in a compile error Weak typing Objects can be converted under the covers at any time Perl: ‘4’/2 => 2 Ruby is strongly typed Mike Bowler — Ruby for Java Programmers Page 6 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Early/Late Binding Early binding All method invocations must be defined at compile time Java: foo.getUser() Late binding The runtime does not check that a given method exists until an attempt to invoke it Smalltalk: foo getuser. Ruby uses late binding Mike Bowler — Ruby for Java Programmers Page 7 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. The Parts of Ruby Virtual machine with garbage collection Standard libraries Core API • Base classes and modules, such as String, Array, Symbol, etc. Standard API Core API Ruby Virtual Machine Standard API • Additional libraries such as CGI, OpenURI, and REXML Mike Bowler — Ruby for Java Programmers Page 8 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Inheritance garfield = Cat.new Object Module Animal Class Cat garfield Mike Bowler — Ruby for Java Programmers Inherits from Instance of Page 9 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. class ZebraCage < Cage attr_accessor :capacity @@allCages = Array.new def initialize maximumZebraCount @capacity = maximumZebraCount @@allCages << self end private def clean_cage # do some stuff here end end cage = ZebraCage.new 10 puts cage.capacity Mike Bowler — Ruby for Java Programmers Page 10 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Naming do_something if list.empty? name.strip name.strip! Mike Bowler — Ruby for Java Programmers Page 11 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Syntactic Sugar: Array list = Array.new list << 'one' << 'two' << 'three' list.push('one', 'two', 'three') list = ['one', 'two', 'three'] list = %w(one two three) Mike Bowler — Ruby for Java Programmers Page 12 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Syntactic Sugar: Hash hash = Hash.new hash[:a] = 4 hash[:b] = 5 hash = {:a => 4, :b => 5} Mike Bowler — Ruby for Java Programmers Page 13 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Syntactic Sugar: Hash def dump number, hash puts hash.keys.sort { |a,b| a.to_s <=> b.to_s } end dump 30, {:a => 5, :b => 3} dump 100, :a => 5, :b => 3 Mike Bowler — Ruby for Java Programmers Page 14 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Syntactic Sugar: Regexp line = $1 if line =~ /^\s*(.+)\s*$/ regex = Regexp.new '^\s*(.+)\s*$' matchData = regex.match line line = matchData[1] unless matchData.nil? Mike Bowler — Ruby for Java Programmers Page 15 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Nil and Null Java’s null Absence of an object Ruby’s nil An instance of NilClass if( a != null ) {...} unless a.nil? {...} null.toString() -> NPE nil.to_s -> “” null.getUser() -> Exception in thread "main" java.lang.NullPointerException Mike Bowler — Ruby for Java Programmers nil.get_user -> NoMethodError: undefined method ‘get_user’ for nil:NilClass Page 16 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Message != Method Customer Person Object first_name() Message Mike Bowler — Ruby for Java Programmers Method Page 17 What if there isn’t a method for the specified message? Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Customer Message Person Object search() method_missing() Method Mike Bowler — Ruby for Java Programmers Page 18 method_missing Example from ActiveRecord Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. user = Users.find_by_name(name) user = Users.find(:first, :conditions => [ "name = ?", name]) Mike Bowler — Ruby for Java Programmers Page 19 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Creating Proxy Objects Mock object for testing Proxy object to allow distributed objects across machines Wrapper to record usage of a given object Mike Bowler — Ruby for Java Programmers Page 20 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Implementing a Proxy class Proxy def method_missing name, *args, &proc puts name,args end end Proxy.new.foo_bar ‘a’ foo_bar a Mike Bowler — Ruby for Java Programmers Page 21 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Implementing a Proxy class Proxy instance_methods.each do |method| undef_method method unless method =~ /^__/ end def method_missing name, *args, &proc puts name,args end end Proxy.new.to_s Mike Bowler — Ruby for Java Programmers Page 22 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Duck Typing Duck typing implies that an object is interchangeable with any other object that implements the same interface, regardless of whether the objects have a related inheritance hierarchy. – Wikipedia "If it walks like a duck and quacks like a duck, it must be a duck." – Pragmatic Dave Thomas Mike Bowler — Ruby for Java Programmers Page 23 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Numeric Overflow: Java int a = Integer.MAX_VALUE; System.out.println(" a="+a); System.out.println("a+1="+(a+1)); a=2147483647 a+1=-2147483648 Mike Bowler — Ruby for Java Programmers Page 24 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Numeric Overflow: Ruby number = 1000 1.upto(4) do puts "#{number.class} #{number}" number = number * number end Fixnum Fixnum Bignum Bignum 1000 1000000 1000000000000 1000000000000000000000000 Mike Bowler — Ruby for Java Programmers Page 25 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Closures An object that is a block of code Can be assigned to variables and passed to methods Has access to the scoped variables at the point it is created number = 1000 1.upto(4) do puts "#{number.class} #{number}" number = number * number end Mike Bowler — Ruby for Java Programmers Page 26 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Closures def foo &proc proc.call 3 proc.call 2 proc.call 1 end Results 6 4 2 Mike Bowler — Ruby for Java Programmers a = 2 foo { |number| puts number*a } foo do | number | puts number*a end Page 27 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Closures – Cleaner Syntax def foo &proc proc.call 3 proc.call 2 proc.call 1 end Mike Bowler — Ruby for Java Programmers def foo yield 3 yield 2 yield 1 end Page 28 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Closures file = File.new(fileName,'w') begin file.puts ‘some content’ rescue file.close end File.open(fileName,'w') do |file| file.puts ‘some content’ end Mike Bowler — Ruby for Java Programmers Page 29 Colorado Software Summit: October 22 – 27, 2006 // Read the lines and split them into columns List<String[]> lines= new ArrayList<String[]>(); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("people.txt")); String line = reader.readLine(); while( line != null ) { lines.add( line.split("\t") ); } } finally { if( reader != null ) { reader.close(); } } © Copyright 2006, Gargoyle Software Inc. # Load the data lines = Array.new IO.foreach('people.txt') do |line| lines << line.split end # Sort and write it back out File.open('people.txt', 'w') do |file| lines.sort {|a,b| a[1] <=> b[1]}.each do | array | puts array.join("\t") end end // then sort Collections.sort(lines, new Comparator<String[]>() { public int compare(String[] one, String[] two) { return one[1].compareTo(two[1]); } }); // then write them back out BufferedWriter writer = null; try { writer = new BufferedWriter( new FileWriter("people.txt") ); for( String[] strings : lines ) { StringBuilder builder = new StringBuilder(); for( int i=0; i<strings.length; i++ ) { if( i != 0 ) { builder.append("\t"); } builder.append(strings[i]); } } } finally { if( writer != null ) { writer.close(); } } Mike Bowler — Ruby for Java Programmers Page 30 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Ruby File IO Sample # Load the data lines = Array.new IO.foreach('people.txt') do |line| lines << line.split end # Sort and write it back out File.open('people.txt', 'w') do |file| lines.sort {|a,b| a[1] <=> b[1]}.each do | array | puts array.join("\t") end end Mike Bowler — Ruby for Java Programmers Page 31 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Closure-like Things in Java final String name = getName(); new Thread( new Runnable() { public void run() { doSomething(name); } }).start(); Mike Bowler — Ruby for Java Programmers Page 32 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Closures for Java 7? Proposal for closures in Java http://www.javac.info/closures-v03.html <T extends java.io.Closeable, throws E> void closeAtEnd({T=>void}throws E block, T t) throws E { try { block.invoke(); } finally { try { t.close(); } catch (IOException ex) {} } } closeAtEnd(FileReader in : makeReader()) closeAtEnd(FileWriter out : makeWriter()) { // do something } Mike Bowler — Ruby for Java Programmers Page 33 Inheriting Behaviour from Multiple Places Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. C++ has multiple inheritance Java has interfaces Ruby has mixins Mike Bowler — Ruby for Java Programmers Page 34 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. C++ : Multiple Inheritance Class C Class E Class B Class D Class A Mike Bowler — Ruby for Java Programmers Page 35 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Java : Inheritance Interface 1 Class C Interface 1 Class B Class A Mike Bowler — Ruby for Java Programmers Page 36 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Ruby : Mixins Mixin 1 Class B Mixin 2 Mixin 1 Class A Mike Bowler — Ruby for Java Programmers Page 37 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Mixins module SampleModule def do_something puts 'doing something' end end class SampleClass include SampleModule end SampleClass.new.do_something Mike Bowler — Ruby for Java Programmers Page 38 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Enumerable Requires that the class implement each() For max, min and sort the <=> operator is also needed Adds many methods for modifying, searching, sorting the items all?, any?, collect, detect, each_cons, each_slice, each_with_index, entries, enum_cons, enum_slice, enum_with_index, find, find_all, grep, include?, inject, map, max, member?, min, partition, reject, select, sort, sort_by, to_a, to_set, zip Mike Bowler — Ruby for Java Programmers Page 39 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Enumerable Examples people.find { |person| person.last_name == 'Smith' } people.sort {|a,b| a.last_name <=> b.last_name} lastNames = people.collect {|p| p.last_name} Mike Bowler — Ruby for Java Programmers Page 40 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Domain Specific Languages A domain-specific programming language (domainspecific language, DSL) is a programming language designed to be useful for a specific set of tasks. – Wikipedia Mike Bowler — Ruby for Java Programmers Page 41 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. DSL Samples ANT <target name="compile" depends="init" description="compile" > <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}"/> </target> Google Maps pizza near keystone resort, keystone co Mike Bowler — Ruby for Java Programmers Page 42 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. DSL Samples task :clobber => [:clean] do rm_r "tempdir" end Mike Bowler — Ruby for Java Programmers Page 43 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. DSL: ActiveRecord class ListItem < ActiveRecord::Base belongs_to :amazon_item acts_as_taggable acts_as_list :scope => :user end Mike Bowler — Ruby for Java Programmers Page 44 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Meta Programming attr_accessor has_many once_only Mike Bowler — Ruby for Java Programmers Page 45 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. attr_accessor class Foo attr_accessor :bar end class Foo def bar @bar end def bar=(newBar) @bar = newBar end end Mike Bowler — Ruby for Java Programmers Page 46 Possible Implementation of attr accessor Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. class Foo def self.my_attr_accessor symbol name = symbol.id2name module_eval <<-DONE def #{name}() @#{name} end def #{name}=(newValue) @#{name} = newValue end DONE end my_attr_accessor :bar end Mike Bowler — Ruby for Java Programmers Page 47 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. ActiveRecord class ListItem < ActiveRecord::Base belongs_to :amazon_item acts_as_taggable acts_as_list :scope => :user end Mike Bowler — Ruby for Java Programmers Page 48 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Date :: once def once(*ids) # :nodoc: for id in ids module_eval <<-"end;", __FILE__, __LINE__ alias_method :__#{id.to_i}__, :#{id.to_s} private :__#{id.to_i}__ def #{id.to_s}(*args, &block) if defined? @__#{id.to_i}__ @__#{id.to_i}__ elsif ! self.frozen? @__#{id.to_i}__ ||= __#{id.to_i}__(*args, &block) else __#{id.to_i}__(*args, &block) end end end; end end Mike Bowler — Ruby for Java Programmers Page 49 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Continuations Imagine... Mike Bowler — Ruby for Java Programmers Page 50 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Continuations A snapshot of the call stack that the application can revert to at some point in the future Mike Bowler — Ruby for Java Programmers Page 51 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Continuation Web Server class SampleServlet < ContinuationServlet def do_work for i in 1..35 yield_now if i % 5 == 0 @response.body << " : #{i}" end yield_now @response.body = 'done' end end Mike Bowler — Ruby for Java Programmers Page 52 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Webrick class Sample < WEBrick::HTTPServlet::AbstractServlet def service(request, response) @response.body = “hello world” end end server = WEBrick::HTTPServer.new(:Port => 9005) server.mount('/', Sample) trap("INT") { server.shutdown } server.start Mike Bowler — Ruby for Java Programmers Page 53 Colorado Software Summit: October 22 – 27, 2006 class ContinuationException < Exception end © Copyright 2006, Gargoyle Software Inc. class ContinuationServlet < WEBrick::HTTPServlet::AbstractServlet @@cc = nil def yield_now @request, @response = callcc do | cc | @@cc = cc raise ContinuationException.new end end def service(request, response) @@cc.call [request, response] unless @@cc.nil? @request, @response = request, response begin do_work() rescue ContinuationException => e end end end Mike Bowler — Ruby for Java Programmers Page 54 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Continuation Web Server class SampleServlet < ContinuationServlet def do_work for i in 1..35 yield_now if i % 5 == 0 @response.body << " : #{i}" end yield_now @response.body = 'done' end end Mike Bowler — Ruby for Java Programmers Page 55 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Recap Learning a new language will make you better with all the languages you know Ruby has a much more concise syntax which means that it takes much less code to solve the same problems Concepts Closures Domain specific languages Metaprogramming Continuations Mike Bowler — Ruby for Java Programmers Page 56 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Ruby on the Java™ Platform JRuby See Roberto Chinnici’s presentation on “Scripting in the Java™ Platform” Mike Bowler — Ruby for Java Programmers Page 57 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. More Information Ruby homepage http://www.ruby-lang.org/en/ Ruby doc Extensive documentation for all core and standard libraries http://www.ruby-doc.org/ Ruby Central Home of the one-click Windows installer http://www.rubycentral.com/ Mike Bowler — Ruby for Java Programmers Page 58 Colorado Software Summit: October 22 – 27, 2006 © Copyright 2006, Gargoyle Software Inc. Contacting Me Mike Bowler [email protected] I’ll be here all week Please fill out your evaluations Mike Bowler — Ruby for Java Programmers Page 59