Ruby Programmers Best Friend
Ruby Programmers Best Friend
Ruby is designed to
make programmers
happy
They think, "By doing this, the machine will run faster. By
doing this, the machine will run more effectively."
#equivalent to:
puts x if not x == y
puts x unless x = y
Syntax Primer
students = [
{:name=>'anwar'},{:name=>'ashraf'},
{:name=>'wael'},{:name=>'akram'},
{:name=>'ayman'}
]
• Code blocks
dog = Animal.new
#or
dog = Animal.new()
class Animal
def sleep
end
end
def cat.sleep
# ..
end
#cat can now sleep as well as eat
Example
class Animal
public
def eat
end
private
def drink
end
end
cat = Animal.new
cat.eat #works
cat.drink #error!
Access Levels
Usage
Cat = Animal.new
cat.enemy=(dog) #or
cat.enemy = dog
#get only
attribute_reader :eye_color
#set only
attribute_writer :see
end
Uniform Access Principle
Class Animal
def eat(*food)
# when variables are recieved,
# they are stored in an array named food
end
end
cat = Animal.new
cat.eat(mouse, fish, shrimp) # or
cat.send(“eat”, mouse, fish, shrimp)
Methods
to_xml(chart,{:name=>'one',:color=>'blue'})
# or
to_xml(chart,:name=>'one',:color=>'blue')
# or
to_xml chart,{:name=>'one',:color=>'blue'
Methods
Return values
• Methods return the last executed expression value
• Unless return is provided explicitly
def add(a, b)
a + b # this is equal to “return a + b”
end
def max(a,b)
return a if a > b # explicit return
b
end
Methods
Return values
• Methods can return multiple values
• Ruby has mass assignments
def min_max(a, b)
return a,b if a < b
b, a
end
def swap(a, b)
b, a # similar to saying: a, b = b, a
end
Methods
method_missing
• This method acts as a trap for undefined methods
• Used to create methods on the fly!
class Recorder
@@calls = []
def method_missing(name,*args)
@@calls << [name,args]
end
def play_back(obj)
@@calls.each do |call|
obj.send(call[0], *call[1])
end
end
end
Methods
method_missing (contd.)
Recorder = Recorder.new
recorder.downcase!
recorder.capitalize!
recorder.playback('camelCase')
# returns Camelcase
Syntax
Blocks appear after method call, either surrounded by
do..end or {..}
17.times do
puts “i will not be naughty”
end
# or
Enumerable (again)
Most methods in enumerable yield control to associated
blocks (visitor pattern)
Examples
Print array elements
[1,2,3,4].each{|element| puts element}
# prints 1234
Common idioms
Auto close for file operations
File.open(path) do |file|
file.each do |line|
# do something with line
end
end
Common idioms
Auto commit for transactions
# common Rails code
user.transaction do
# some transactional operations
# that we need to make sure all happen
end
add3 = add(3)
add3.call(5) # 8
add7 = add(7)
add7.call(2) # 9
Reflection
Reflection
Definition
It means the ability to lookup the structure of the
program in run time
In Ruby, it comes in three flavors
• Object reflection
• Class reflection
• System reflection
Reflection
Object reflection
You can check the methods of an object
[1,2,3].methods.select{|m|m==”send”}
# returns [“send”]
Class reflection
You can check a class' superclass
Cat.superclass # Animal
Animal.superclass # Object
System reflection
You can ask the Ruby environment what objects are
present in the system!.
ObjectSpace.each_object do |obj|
# iterate over all the objects in the system
end
inherited
# called on a class whenever it is subclassed
included
# called on a module whenever it is included
System Hooks
Definition
Metaprogramming is the ability to program your
program!
• In Ruby class definition bodies are actually executable
code!
• We have seen them already, but tricked because of
Ruby syntax
• Remember attribute_accessor?
MetaProgramming