
Introduction
Take a look at this, there is two classes: a person and a teacher. The person (originally) just know how to speak English and then teacher teach him speak other language, it can show you how powerful and beautiful ruby is.
class Person
attr_accessor :name
def speak_english
puts "Hi people!"
end
end
class BrPortugueseTeacher
def teach(person)
def person.speak_portuguese
puts "Ola pessoal!"
end
end
end
bill_gates = Person.new
bill_gates.nome = "Bill Gates"
pasquale = Teacher.new
pasquale.teach bill_gates
#now bill gates knows portuguese
bill_gates.speak_portuguese
The intent here is just show a quick overview of ruby from a newbie.
Code’s comment
#one line comment
=begin
Multiply lines comment.
Given that ...
=end
String
String in ruby is mutable (but when you use the operator method + it creates another string, so to concatenate strings you should use the operator <<) and just a little tip avoid the concatenation by using + instead prefer use interpolation, a way to handle string very similar to expression language, and it’s faster than normal concatenation.
ran = 34434
who = "Leandro Moreira"
puts "#{who} generates this #{ran} number"
Conventions
Yet on mutability, when you write a method that can affect the internal state, you should use the bang operator (!) on method’s name.
old_source_name = "angeline"
puts old_source_name.capitalize
puts old_source_name.capitalize!
Another cool convention to Boolean methods is end them with ?
if account.cancelled?
puts "Run Forest, run!"
end
Range object
In ruby you can use a type Range to describe ranges and its use is very easy.
zero_to_ten = (0..10) #inclusive
one_to_seven = (0...8) #exclusive
alphabetic = ('a'..'z') #you also can omit the (
It’s all object and quick tips
- Hey, language prints I win three times.
puts "I win " * 3
You can use anything on if statement and it can ben true or false (and nil which is false too).
A weird thing is one way of handle the regular expressions.
/myexp/ =~ "sentence"
#"sentence" matches myexp?
Another weird operator is or equals.
list ||= flights
#the list will just receive the flights if list is nil.
The classes are really open
One of the main features of ruby is Open Class, this is cool, you just can grab a class and write a new feature for it.
class String
def do_nothing
puts "doing nothig"
end
end
And then you just call it.
"number".do_nothing
Let’s trick the addition operations on number.
class Fixnum
def +(other)
self - other
end
end
puts 2+1
#and it will prints 1. (~:
Variable arguments
Sometimes you need to use this kind of flexibility.
user.buy computer
user.buy computer, mouse, monitor
To achieve this you just use the syntax. The splat operator how it is known.
def buy(*products)
#buy logic
end
Hash enhancements
There is a lot of people which claims to use hash as parameter.
e_account.transfer :to_account => my, :value => 4800
def transfer (parameters)
dest_account = parameters[:to_account]
#...
end
Declarations
class Anything
@field #object field
@@field #class field
end
Singleton in Ruby
Singleton pattern is a design pattern used to implement the mathematical concept of a singleton, by restricting the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects (say, five). Some consider it an anti-pattern, judging that it is overused, introduces unnecessary limitations in situations where a sole instance of a class is not actually required, and introduces global state into an application. (From wikipedia)
class HyperDao
@@instance = HyperDao.new
def self.instance
return @@instance
end
private_class_method :new
end
But we’re talking about ruby, don’t we?
require 'singleton'
class God
include Singleton
end
It’s done!
Equals
If you want or need to rewrite the equals…
def ==(other)
self.id = other.id
end
Duck typing – good-bye interface
Duck typing is a style of dynamic typing in which an object’s current set of methods and properties determines the valid semantics, rather than its inheritance from a particular class or implementation of a specific interface. The name of the concept refers to the duck test, attributed to James Whitcomb Riley (see History below), which may be phrased as follows:”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” (From Wikipedia)
class PremiumAccount
def saldo
#
end
end
class CommonAccount
def saldo
#
end
end
The bank manager will accept that.
class BankManager
def total_debt(accounts)
for account in accounts do
debt += account.saldo
end
end
end
Mixin
Mixin is a class that provides a certain functionality to be inherited or just reused by a subclass, while not meant for instantiation (the generation of objects of that class). Inheriting from a mixin is not a form of specialization but is rather a means of collecting functionality. A class may inherit most or all of its functionality from one or more mixins through multiple inheritance. (Again, from Wikipedia)
module Logging
def log(message)
puts message
end
end
class Anything
include Logging
#...
end
any = Anything.new
any.log "It started now!"
Metaprogramming
Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do part of the work at compile time that would otherwise be done at runtime. In many cases, this allows programmers to get more done in the same amount of time as they would take to write all the code manually, or it gives programs greater flexibility to efficiently handle new situations without recompilation.
class Person
attr_accessor :name
def speak_english
puts "Hi people!"
end
end
class BrPortugueseTeacher
def teach(person)
def person.speak_portuguese
puts "Ola pessoal!"
end
end
end
bill_gates = Person.new
bill_gates.nome = "Bill Gates"
pasquale = Teacher.new
pasquale.teach bill_gates
#now bill gates knows portuguese
bill_gates.speak_portuguese
Highly influenced by ruby on rails from Caelum.