Unit 2: Ruby Programming
2026-01-17
Central Ruby site: https://www.ruby-lang.org/en/
Online ide: https://try.ruby-lang.org/playground/
Download page:
Tutorial: https://try.ruby-lang.org https://pine.fm/LearnToProgram/
Documentation: https://ruby-doc.org/
Programming Manual: https://ruby-doc.org/docs/ruby-doc-bundle/ProgrammingRuby/index.html
#!/usr/bin/env ruby
# Demonstration of Ruby's standard numeric data types
puts "Ruby Data Types".upcase
def unitheader(header)
puts
puts header
puts "-" * 65
end
def example(lbl, op)
x = eval(op)
puts " #{lbl.ljust(12)}, #{op.ljust(27)} #{x} (#{x.class})"
end
unitheader("Integer examples:")
example("@int_a","@int_a = 42")
example("@int_b","@int_b = -100")
example("Sum:","@int_a + @int_b")
unitheader("Float examples:")
example("@float_a","@float_a=3.14159")
example("@float_b","@float_b = -0.5")
example("Product:","@float_a * @float_b")
unitheader("Rational examples:")
example("@rational_a","@rational_a = Rational(2,3)")
example("@rational_b","@rational_b = 5r")
example("Sum:","@rational_a + @rational_b")
unitheader("Complex examples:")
example("@complex_a","@complex_a = Complex(2,3)")
example("@complex_b","@complex_b = 4 + 5i")
example("Sum:","@complex_a + @complex_b")
unitheader("Type conversions:")
example("Int2Float:","@int_a.to_f")
example("Float2Int","@float_a.to_i")
example("Int2Rational","@int_a.to_r")
example("Int2Complex","@int_a.to_c")
unitheader("Automatic type promotion:")
example("Int2Float", "@int_a + @float_a")
example("Int2Rational","@int_a + @rational_a")
example("Rational2Flt","@rational_a+@float_a")
example("Complex2Int","@complex_a + @int_a")
unitheader("Edge case: very large integers")
example("@bigInt", "@big_int = 10**20")
example("inc(@bigInt)","@big_int += 1")
puts "-" * 65RUBY DATA TYPES
Integer examples:
-----------------------------------------------------------------
@int_a , @int_a = 42 42 (Integer)
@int_b , @int_b = -100 -100 (Integer)
Sum: , @int_a + @int_b -58 (Integer)
Float examples:
-----------------------------------------------------------------
@float_a , @float_a=3.14159 3.14159 (Float)
@float_b , @float_b = -0.5 -0.5 (Float)
Product: , @float_a * @float_b -1.570795 (Float)
Rational examples:
-----------------------------------------------------------------
@rational_a , @rational_a = Rational(2,3) 2/3 (Rational)
@rational_b , @rational_b = 5r 5/1 (Rational)
Sum: , @rational_a + @rational_b 17/3 (Rational)
Complex examples:
-----------------------------------------------------------------
@complex_a , @complex_a = Complex(2,3) 2+3i (Complex)
@complex_b , @complex_b = 4 + 5i 4+5i (Complex)
Sum: , @complex_a + @complex_b 6+8i (Complex)
Type conversions:
-----------------------------------------------------------------
Int2Float: , @int_a.to_f 42.0 (Float)
Float2Int , @float_a.to_i 3 (Integer)
Int2Rational, @int_a.to_r 42/1 (Rational)
Int2Complex , @int_a.to_c 42+0i (Complex)
Automatic type promotion:
-----------------------------------------------------------------
Int2Float , @int_a + @float_a 45.14159 (Float)
Int2Rational, @int_a + @rational_a 128/3 (Rational)
Rational2Flt, @rational_a+@float_a 3.8082566666666664 (Float)
Complex2Int , @complex_a + @int_a 44+3i (Complex)
Edge case: very large integers
-----------------------------------------------------------------
@bigInt , @big_int = 10**20 100000000000000000000 (Integer)
inc(@bigInt), @big_int += 1 100000000000000000001 (Integer)
-----------------------------------------------------------------
https://www.ruby-lang.org/en/downloads/
$ irb: to write ruby in the terminal' in ruby, use " instead{} with do end and vice versa –– not true for hashes or #{} escapings[1,2].map(&:to_i)integer: number without decimalfloat: number with decimal$: global variable@: instance variable@@: class variable1_000_000: 1000000 –– just easier to readmy_variable = “Hello”
my_variable.capitalize! # ! changes the value of the var same as my_name = my_name.capitalize
my_variable ||= "Hi" # ||= is a conditional assignment only set the variable if it was not set before.
MY_CONSTANT = # something
my_array = [a,b,c,d,e]
my_array[1] # b
my_array[2..-1] # c , d , e
multi_d = [[0,1],[0,1]]
[1, 2, 3] << 4 # [1, 2, 3, 4] same as [1, 2, 3].push(4)
hash = { "key1" => "value1", "key2" => "value2" } # same as objects in JavaScript
hash = { key1: "value1", key2: "value2" } # the same hash using symbols instead of strings
my_hash = Hash.new # same as my_hash = {} – set a new key like so: pets["Stevie"] = "cat"
pets["key1"] # value1
pets["Stevie"] # cat
my_hash = Hash.new("default value")
hash.select{ |key, value| value > 3 } # selects all keys in hash that have a value greater than 3
hash.each_key { |k| print k, " " } # ==> key1 key2
hash.each_value { |v| print v } # ==> value1value2
my_hash.each_value { |v| print v, " " }
# ==> 1 2 3
:symbol # symbol is like an ID in html. :symbol != "symbol"
# Symbols are often used as Hash keys or referencing method names.
# They can not be changed once created. They save memory (only one copy at a given time). Faster.
:test.to_s # converts to "test"
"test".to_sym # converts to :test
"test".intern # :test
# Symbols can be used like this as well:
my_hash = { key: "value", key2: "value" } # is equal to { :key => "value", :key2 => "value" }
"bla,bla".split(“,”) # takes string and returns an array (here ["bla","bla"])
Methods
def greeting(hello, *names) # *names is a split argument, takes several parameters passed in an array
return "#{hello}, #{names}"
end
start = greeting("Hi", "Justin", "Maria", "Herbert") # call a method by name
def name(variable=default)
### The last line in here gets returned by default
end
custom objects
class Person # class names are rather written in PascalCase (It is similar to camelCase, but the first letter is capitalized)
@@count = 0
attr_reader :name # make it readable
attr_writer :name # make it writable
attr_accessor :name # makes it readable and writable
def Methodname(parameter)
@classVariable = parameter
@@count += 1
end
def self.show_classVariable
@classVariable
end
def Person.get_counts # is a class method
return @@count
end
private
def private_method; end # Private methods go here
end
matz = Person.new("Yukihiro")
matz.show_name # Yukihiro
class DerivedClass < Base
def some_method
super(optional args) #
# Some stuff
end
end
end
module ModuleName
end
Math::PI # using PI constant from Math module.
require 'date' # to use external modules.
puts Date.today # 2016-03-18
module Action
def jump
@distance = rand(4) + 2
puts "I jumped forward #{@distance} feet!"
end
end
class Rabbit
include Action
extend Action
attr_reader :name
def initialize(name)
@name = name
end
end
peter = Rabbit.new("Peter")
peter.jump # include
Rabbit.jump # extend
Blocks are not objects. A block is just a bit of code between do..end or {}. It’s not an object on its own, but it can be passed to methods like .each or .select.
def yield_name(name)
yield("Kim") # print "My name is Kim. "
yield(name) # print "My name is Eric. "
end
yield_name("Eric") { |n| print "My name is #{n}. " }
yield_name("Peter") { |n| print "My name is #{n}. " }
Saves blocks and are objects. A proc is a saved block we can use over and over.
cube = Proc.new { |x| x ** 3 }
[1, 2, 3].collect!(&cube) # [1, 8, 27]
cube.call
lambda { |param| block }
multiply = lambda { |x| x * 3 }
y = [1, 2].collect(&multiply) # 3 , 6
"A " << "B" (yields) "A B"# single line comment
=begin
This is indeed
a multiline comment
=end
if 1 < 2
puts “one smaller than two”
elsif 1 > 2
puts “elsif”
else
puts “false”
end
puts "be printed" if true
puts 3 > 4 ? "if true" : "else"
unless false
puts “I’m here”
else
puts “not here”
end
puts "not printed" unless true
case my_var
when "some value"
###
when "some other value"
###
else
###
end
case my_var
when "some value" then ###
when "some other value" then ###
else ###
end
&&: and
||: or
!: not
(x && (y || w)) && z: use parenthesis to combine arguments
flexibility in expression
problem = false
print "Good to go!" if !problem
print "Good to go!" unless problem
puts "first line" # puts text in a separate line
print "blank"
puts "test" # Both both on a single line
"Hello".length # 5
"Hello#{123}" # Hello123
"Hello".reverse # “olleH”
"Hello".upcase # “HELLO”
"Hello".downcase # “hello”
"hello".capitalize # “Hello”
"Hello".include? "i" # equals to false because there is no i in Hello
"Hello".gsub!(/e/, "o") # Hollo
"1".to_i # transform string to integer –– 1
"test".to_sym # converts to :test
"test".intern # :test
:test.to_s # converts to "test"
gets # reads a line
gets.chomp # removes new line char
i = 1
while i < 11
puts i
i = i + 1
end
i = 0
until i == 6
puts i
i += 1
end
for i in 1...10
puts i
end
i = 0
loop do
i += 1
print "I'm currently number #{i}”
break if i > 5
end
for i in 1..5
next if i % 2 == 0
print i
end
things.each do |item|
print “#{item}"
end
on hashes like so:
hashes.each do |x,y|
print "#{x}: #{y}"
end
10.times do
print “this text will appear 10 times”
end
1.upto(5) { |x| print x, " " } # 1 2 3 4 5
"a".upto("c") { |x| print x, " " } # a b c
array = [5,4,1,3,2]
array.sort! # = [1,2,3,4,5]
"a" <=> "b" # 0 if a = b, 1 if a > b, -1 if a < b
array.sort! { |a, b| b <=> a } # to sort from Z to A
1.is_a? Integer # returns true
:1.is_a? Symbol # returns true
"1".is_a? String # returns true
[1,2,3].collect!() # does something to every element (overwrites original with ! mark)
.map() # is the same as .collect
1.2.floor # 1 # rounds down to the nearest integer.
cube.call # call calls procs directly
Time.now # displays the actual time
Key Features Users can search for local businesses, view Street View panoramas, and access offline maps. The mobile app integrates live GPS navigation and business reviews from millions of contributors.
Thailand Context In Chiang Mai, such as your location in San Pu Loei, gmap proves useful for navigating rural areas, finding nearby attractions like Doi Suthep, or checking traffic on routes to the city center. Specialized Thai tools like gmap.mhesi.go.th offer project dashboards for local development.
Alternatives GMAP Analytics focuses on business location intelligence, while the GMAP tool assesses environmental risks in agro-commodities. For immersive views, try Google Earth or Street View.
A 4-hour Ruby basics course:
Download and install ruby
Determine if ruby is available and working:
ruby -v to determine the version of the rubyhello.rb that contain this line:puts “Hello, World!”
ruby hello.rbTry storing different type of data by typing the following content into a file named, datatest.rb:
a = 12 b = 3.14159265358979323846264338327950288419716939937510 c = “Name:ohn Smith:2 Sunset Dr.hiang Mai” d = ‘Name:ohn Smith:2 Sunset Dr.hiang Mai’ e = 3 < 5 f = Math::PI.to_r g = :red h = [:red,:orange,:yellow,:green,:cyan,:blue,:purple,:black,:white] i = {:red => “#FF0000”, :orange => “#FF8800#”, :yellow => “#FFFF00”, :green => “#00FF00”, :cyan => “#00FFFF”, :blue => “#0000FF”, :purple => “#FF00FF”, :black => “#000000”, :grey => “#999999”, :white => “#FFFFFF”}
data = [a,b,c,d,e,f,g,h,i]
data.each do |value| puts value; end
data.each do |value| puts value.class; endbasic data types (strings, integers, floats, booleans), and simple arithmetic/string operations like name.length or “hello” + ” world”.
Teach conditionals (if, else, elsif, ternary condition ? true : false), comparison operators (==, >, &&), and user input (gets.chomp). Add case statements for multi-way branching. Demo a basic number guessing game.
Explain arrays (arr = [1,2,3]; arr[0]), hashes (hash = {key: “value”}), and iteration (each, for, while, times). Cover common methods like push, pop, length, keys, values, select. Build a Mad Libs-style story generator.
Define methods (def greet(name); puts “Hi #{name}”; end), parameters, return values, and scope. Introduce classes (class Person; def initialize(name); @name = name; end; end), basic objects, and a simple attr_accessor. Wrap with a mini-project like a quiz or calculator, plus debugging tips (p vs puts, binding.pry).
IT212 Data Structure