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.
[…] send (using a browser, for example) a request for the server: -Hey Internet, give me the Ruby overview web site. […]
[…] and work for the improvement of your legacy product. If you are totally new for ruby maybe a ruby overview can help you. (or might confuse you […]