Intro to Ruby
Download
Report
Transcript Intro to Ruby
Ruby
What is Ruby?
Programming Language
Object-oriented
Interpreted
Popular- Ruby on Rails a framework for Web Server
Programming
Interpreted Languages
Not compiled like Java
Code is written and then directly executed by an
interpreter
Type commands into interpreter and see immediate results
Java:
Ruby:
Code
Compiler
Code
Runtime
Environment
Computer
Interpreter
Computer
What is Ruby on Rails (RoR)
Development framework for web applications written in
Ruby
Used by some of your favorite sites!
Advantages of a framework
Standard features/functionality are built-in
Predictable application organization
Easier to maintain
Easier to get things going
Installation
Windows
Navigate to: http://www.ruby-lang.org/en/downloads/
Scroll down to "Ruby on Windows"
Download the "One-click Installer"
Follow the install instructions
Include RubyGems if possible (this will be necessary for Rails installation
later)
Mac/Linux
OS X 10.4 ships with broken Ruby! Go here…
http://hivelogic.com/articles/view/ruby-rails-mongrel-mysql-osx
hello_world.rb
puts "hello world!"
All source code files end with .rb = ruby
NOTE: we are not really going to learn
how to make general ruby programs
but, in this class we will learn about
Ruby on Rails ---which is a web
framework for making web apps or web
sites.
puts vs. print
"puts" adds a new line after it is done
analogous System.out.println()
"print" does not add a new line
analogous to System.out.print()
Running Ruby Programs (via
interpreter)
Use the Ruby interpreter
ruby hello_world.rb
“ruby” tells the computer to use the Ruby
interpreter
Interactive Ruby (irb) console NOTE: we are not
really going to learn
how to make general
irb
ruby programs but, in
this class we will learn
Get immediate feedback
about Ruby on Rails --which is a web
Test Ruby features
framework for making
web apps or web sites.
Comments
# this is a single line comment
=begin
this is a multiline comment
nothing in here will be part of the
code
=end
Variables
Declaration – No need to declare a "type"
Assignment – same as in Java
Example: (like javascript)
x = "hello world"
y=3
z = 4.5
r = 1..10
# String
# Fixnum
# Float
# Range
Variable Names and Scopes
foo
$foo
@foo
@@foo
MAX_USERS
Local variable
Global variable
Instance variable in object
Class variable
“Constant” (by convention)
Difference between instance and
“class” variables
Instance variables are scoped within a specific instance.
instance variable title, each post object will have its own title.
Class variables , instead, is shared across all instances of that class.
class Post
def initialize(title)
@title = title
end
def title
@title
end
end
p1 = Post.new("First post")
p2 = Post.new("Second post")
p1.title
# => "First post"
p2.title
# => "Second post"
class Post
@@blog = "The blog“
# previous stuff for title here…….
def blog
@@blog
end
def blog=(value)
@@blog = value
end
end
p1.blog
# => "The blog"
p2.blog
# => "The blog“
p1.blog = "New blog"
p1.blog
# => "New blog"
p2.blog
# => "New blog"
Objects
Everything is an object.
Common Types (Classes): Numbers, Strings,
Ranges
nil, Ruby's equivalent of null is also an object
Uses "dot-notation" like Java objects
You can find the class of any variable
x = "hello"
x.class
String
You can find the methods of any variable or class
x = "hello"
x.methods
String.methods
String Literals
“How are you today?”
Ruby String Syntax
Single quotes (only \' and \\)
'Bill\'s "personal" book'
Double quotes (many escape sequences)
"Found #{count} errors\nAborting job\n"
%q (similar to single quotes)
%q<Nesting works: <b>Hello</b>>
%Q (similar to double quotes)
%Q|She said "#{greeting}"\n|
“Here documents”
<<END
First line
Second line
END
Equalities
Arrays and Hashes
x = Array.new
# how to declare an array
x << 10
x[0] = 99
y = ["Alice", 23, 7.3]
x[1] = y[1] + y[-1]
ary = Array.new
Array.new(3)
Array.new(3, true)
#sets to empty array []
#sets to length of 3 [nil, nil, nil]
#sets to length of 3 [true, true, true]
person = Hash.new
person["last_name"] = "Rodriguez"
person[:first_name] = "Alice“
order = {"item" => "Corn Flakes", "weight" => 18}
order = {:item => "Corn Flakes", :weight => 18}
order = {item: "Corn Flakes", weight: 18}
Hashes – Starting the Zombies
example
From http://railsforzombies.org/
Arrays ---accessing elements
arr = [1, 2, 3, 4, 5, 6]
arr[2]
# 3
arr[100] # nil
arr[-3]
# 4
arr[2, 3] # [3, 4, 5] –means start index 2 and get 3 elements
arr[1..4]
# [2, 3, 4, 5] –means start index 1 through 4 index
Also, arr.first and arr.last
array = [14, 22, 34, 46, 92]
for value in array do
...
end
Objects (cont.)
There are many methods that all Objects have
Include the "?" in the method names, it is a Ruby
naming convention for boolean methods
nil?
eql?/equal?
(3.eql?2)
==, !=, ===
instance_of?
is_a?
to_s
Numbers
Numbers are objects
Different Classes of Numbers
FixNum, Float
3.eql?2
-42.abs
3.4.round
3.6.round
3.2.ceil
3.8.floor
3.zero?
false
42
3
4
4
3
false
Boolean
nil or false = false
Everything else = true
String Methods
"hello world".length
11
"hello world".nil?
false
"".nil?
false
"ryan" > "kelly"
true
"hello_world!".instance_of?String
"hello" * 3
"hellohellohello"
"hello" + " world"
"hello world"
"hello world".index("w")
6
true
Operators and Logic
Same as Java
* , / , +, Also same as Java
"and" and "or" as well as "&&" and "||"
Strings
String concatenation (+)
String multiplication (*)
Conditionals: if/elsif/else/end
Must use "elsif" instead of "else if"
Notice use of "end". It replaces closing curly braces in Java
Example:
if (age < 35)
puts "young whipper-snapper"
elsif (age < 105)
puts "80 is the new 30!"
else
puts "wow… gratz..."
end
Inline "if" statements
Original if-statement
if age < 105
puts "don't worry, you are still young"
end
Inline if-statement
puts "don't worry, you are still young" if age < 105
Case Statements
grade = case score
when 0..60: ‘F’
when 61..70: ‘D’
when 71..80: ‘C’
when 81..90: ‘B’
when 90..100: ‘A’
end
for-loops
for-loops can use ranges
Example 1:
for i in 1..10
puts i
end
for-loops and ranges
You may need a more advanced range for
your for-loop
Bounds of a range can be expressions
Example:
for i in 1..(2*5)
puts i
end
Out of blocks or loops: break, redo,
next, retry
while-loops
Cannot use "i++"
Example:
i=0
while i < 5
puts i
i=i+1
end
Example little routine
No variable declarations
sum = 0
Newline is statement separator
i = 1
while i <= 10 do
sum += i*i
i = i + 1
do ... end instead of { ... }
end
puts "Sum of squares is #{sum}\n"
Optional parentheses
in method invocation
Substitution in
string value
unless
"unless" is the logical opposite of "if"
Example:
unless (age >= 105)
puts "young."
else
puts "old."
end
# if (age < 105)
until
Similarly, "until" is the logical opposite of "while"
Can specify a condition to have the loop stop
(instead of continuing)
Example
i=0
until (i >= 5)
puts I
i=i+1
end
# while (i < 5), parenthesis not required
Methods
Structure
def method_name( parameter1, parameter2, …)
statements
end
Simple Example:
def print_ryan
puts "Ryan"
end
Parameters
No class/type required, just name them!
Example:
def cumulative_sum(num1, num2)
sum = 0
for i in num1..num2
sum = sum + i
end
return sum
end
# call the method and print the result
puts(cumulative_sum(1,5))
Return
Ruby methods return the value of the last
statement in the method, so…
def add(num1, num2)
sum = num1 + num2
return sum
end
can become
def add(num1, num2)
num1 + num2
end
Method with array as parameter
def max(first, *rest)
result= first
for x in rest do
if (x > result) then
result= x
end
end
return result
end
Modules – require one .rb file into
another
Modules: Grouping of methods,
classes, constants that make sense
together…a bit like a library
User Input
"gets" method obtains input from a user
Example
name = gets
puts "hello " + name + "!"
Use chomp to get rid of the extra line
puts "hello" + name.chomp + "!"
chomp removes trailing new lines
Changing types
You may want to treat a String a number or a
number as a String
to_i – converts to an integer (FixNum)
to_f – converts a String to a Float
to_s – converts a number to a String
Examples
"3.5".to_i
"3.5".to_f
3.to_s
3
3.5
"3"
Constants
In Ruby, constants begin with an Uppercase
They should be assigned a value at most once
This is why local variables begin with a lowercase
Example:
Width = 5
def square
puts ("*" * Width + "\n") * Width
end
Handling Exceptions: Catch Throw
def sample # a silly method that throws and exception
x=1
General format of handling exceptions
throw :foo if x==1
end
begin
begin
puts ‘start’
sample # call above method
puts ‘end’
rescue
puts ‘exception found’
end
# - code that could cause exception
rescue OneTypeOfException
# - code to run if OneTypeException
rescue AnotherTypeOfException
# - code to run if AnotherTypeOfException
else
# code to run for Other exceptions
end
Classes
Simple Class
class Point
def initialize(x, y)
@x = x
@y = y
end
def x
@x
end
#defining class variable
def x=(value)
@x = value
end
end
#code using class
p = Point.new(3,4)
puts "p.x is #{p.x}"
Slide 46
p.x = 44
Another class - Book
class Book
def initialize(title, author, date)
@title = title
#various variables
@author = author
@date = date
end
def to_s
#method to make string
"Book: #@title by #{@author} on #{@date}"
end
end
Book class—adding methods to access
class variables (setter/getter)
class Book
def initialize(title, author, date) # constructor
@title = title
@author = author
@date = date
end
def author
@author
end
#method to access class variable author
def author=(new_author)
@author = new_author
end
end
#method to set value of class variable author
Class Inheritance (calling parent-super)
class Book
def initialize(title, author, date)
@title = title
@author = author
@date = date
end
def to_s
"Book: #@title by #{@author}
on #{@date}"
end
end
class ElectronicBook < Book
def initialize(title, author, date, format)
super(title, author, date)
@format = format
end
def to_s
super + " in #{@format}"
end
end
Protection Types –here for methos
class Foo
def method1
end
def method2
end
....
public :method1, method3
protected :method2
private
:method4, method5
end
Public Methods: Public methods can
be called by anyone.
Methods are public by default except
for initialize, which is always private.
Private Methods: Private methods
cannot be accessed, or even viewed
from outside the class. Only the class
methods can access private members.
Protected Methods: A protected
method can be invoked only by
objects of the defining class and its
subclasses. Access is kept within the
family.
Creating a method operator called <
(w/test class showing using it)
class Book
attr_reader :title
def initialize(title, author, date)
@title = title
@author = author
@date = date
end
require 'test/unit'
require 'book'
class TestExample < Test::Unit::TestCase
def test_operator
cat = Book.new("Cat", "Me", "1990")
dog = Book.new("Dog", "Me", "1990")
assert( cat < dog)
def <(book)
end
return false if book.kind_of(Book) end
title < book.title
end
end
mode = 'a'
File.open('testFile', mode) do |file|
file.print 'cat'
file.puts 'dog'
file.puts 5
end
File I/O
file = File.open('testFile')
while line = file.gets
puts line
end
file.close
File.open('testFile', mode) do |file|
file << 'cat' << "dog\n" << 5 << "\n"
end
File.open('testFile') do |file|
while line = file.gets
puts line
end
end
File.open('testFile') do |file|
file.each_line {|line| puts line}
end
r
read-only, start at beginning of file
r+ read/write, start at beginning of file
w
write-only, start at beginning of file
w+ read/write, start at beginning of file
IO.foreach('testFile') {|line| puts line}
a
write-only, append to end of file
puts IO.readlines('testFile')
a+ read/write, start at end of file
array = IO.readlines('testFile')
b
Binary mode, Windows only, combine with above
Threads
require 'net/http'
NOTE: General code to create thread & associate
running code (do block) and join it to thread pool
thread = Thread.new do
#code to execute in Thread running
end
thread.join
pages = %w{ www.yahoo.com www.google.com slashdot.org}
threads = []
for page_to_fetch in pages
threads << Thread.new(page_to_fetch) do |url|
browser = Net::HTTP.new(url, 80)
puts "Fetching #{url}"
response = browser.get('/', nil)
puts "Got #{url}: #{response.message}"
end
end
threads.each {|thread| thread.join }
Fetching www.yahoo.com
Fetching www.google.com
Fetching slashdot.org
Got www.yahoo.com: OK
Got www.google.com: OK
Got slashdot.org: OK
Note: Thread and HTTP are classes in ruby
References
Web Sites
http://www.ruby-lang.org/en/
http://rubyonrails.org/
Books
Programming Ruby: The Pragmatic Programmers' Guide
(http://www.rubycentral.com/book/)
Agile Web Development with Rails
Rails Recipes
Advanced Rails Recipes