First Ruby examples
=begin
First Ruby examples for CSCi 4651
=end
# output:
puts 'Hello World'
# everything is a class
puts 'Hello World'.class #two kinds of strings: '...' and "..."
# '...' are more efficient
puts 5.class
puts 6.5 .class
puts 1/2
puts 1234576879809812346576877890.class
puts (1/2).class
puts 5.class.class # the class of a class is Class
puts self.class # the class of the current object (main)
# variables do not need declaration and don't have a fixed type
# note that names that start with @ and @@ are used as instance
# and class variable names, respectivelly - do not use them as
# local variables
n = 5;
puts n
n = 'Hi there'
puts n
puts n != n
puts (n != n).class
m = '55'
# Doesn't work: n = m + 2
# m is a string
n = m.to_i + 2
puts n
# special object
puts nil
puts nil.class
# single quotes vs double quotes
puts "#{n} little monkeys jumping on the bed"
puts '#{n} little monkeys jumping on the bed'
# conditionals
# the syntax: if...else...end, where else is optional
if (n == 5)
puts '5 is my favorite number'
else
puts "#{n} is not my favorite number"
n = 5
end
puts "n = #{n}"
# unless
unless n == m
puts 'Here I am'
end
# conditional modifier
puts "n = #{n}" if n < 10
n = 10
puts "n = #{n}" if n < 10
puts "#{n} is a small number" unless n > 10
# loops
while n > 0
puts n
n = n/2
end
sum = 0
until sum >= 20
r = rand(10)
puts "my random number #{r}"
sum += r
puts "the sum is #{sum}"
end
# for loop uses an iterator
# .times is a method of an integer
3.times do
puts 'Hello! '
end
# you can name the loop variable if you need it
puts "a loop with a variable"
5.times do |i|
puts i
end
puts "a step loop"
1.step(10,2) {|k| puts k}
# more loops are possible with ranges (see below)
#
# Some interesting types:
#
# ranges
puts "ranges..."
range1 = (1..5)
puts range1.max
# by convention boolean methods end with a ?
puts range1.include?(7)
puts range1.include?(3.5)
# same thing as an operator:
puts range1 === 7
puts range1 === 3.5
digits = (0...10) #doesn't include 10
puts digits.max
puts digits.min
puts "a for loop with a range"
for i in digits
puts i
end
puts "a better loop for a range"
digits.each {|j| puts j}
# arrays
arr1 = [3, 4, 5, 7]
puts arr1[3]
puts "traversing arrays with a loop"
arr1.each {|j| puts j}
arr2 = [2, 3.5, 'yes', "n = #{n}"]
arr2.each {|j| puts j}
# portions of arrays can be passed around
arr3 = arr2[1,2]
arr3.each {|j| puts j}
# arrays can be extended
arr3[2] = 'hi'
arr3.each {|j| puts j}
# functions (methods)
puts "ruby functions"
def square(x)
return x * x
end
puts square(3)
# optional arguments
def print_error(error_message = 'Error: ', error_num = 0)
puts "Error #{error_num}: #{error_message}"
end
# two alternative ways to call a function:
print_error("Undefined variable", 3)
print_error "Undefined variable", 3
print_error "Undefined variable"
puts "Ruby blocks"
# blocks are segments of code
# blocks can be passed as parameters to methods
def thecall
yield # excutes the block
end
thecall {puts "my block"}
# blocks with parameters
def call_parameter
yield(5)
yield('Hi')
end
call_parameter {|x| puts "I am printing #{x}"}
# if more than one statement in a block, use do/end
call_parameter do |x| puts "x = "; puts x end
# blocks can return values
def call_block
puts yield(5)
puts yield(8.8)
end
call_block {|x| x + 7}
# symbols
puts "each object has its own id"
puts 'Hi'.object_id
puts 'Hi'.object_id
puts 'Hi'.equal?('Hi')
# symbols are small constant objects that consist only of a name
puts :listEnd
list1 = [1, 2, 3, :listEnd]
list2 = [true, false, :listEnd]
# all copies of :listEnd are the same
i = 0
while list1[i] != :listEnd do
puts list1[i]
i += 1
end
# hashes - array indexed by any type
# 'winter' is a key, 'skiing' is a value
hash = {'winter' => 'skiing', 'spring' => 'basketball',
'summer' => 'swimming', 'fall' => 'hiking'
}
hash.each_value {|value| puts value}
hash.each_key {|key| puts key}
hash.each {|key, value| puts "#{value} is a #{key} sport"}
# it is common to use symbols as keys
hash = {:winter => 'skiing', :spring => 'basketball',
:summer => 'swimming', :fall => 'hiking'
}
hash.each_value {|value| puts value}
hash.each_key {|key| puts key}
hash.each {|key, value| puts "#{value} is a #{key} sport"}
# make sure that the program ends successfully
puts 'Bye'
CSci 4651 course.