Språket ble lagd avYukihiro "Matz" Matsumoto, som startet jobben med Ruby den24. februar1993 og lanserte språket i1995. Navnet «Ruby» ble valgt som en litt humoristisk referanse til Perl.[2]
Ruby har blitt spesielt populært i webprogrammeringsmiljøer takket være utviklingsmiljøetRuby on Rails.
Ifølge skaperen ble Ruby utformet etter prinsippet omfærrest mulige overraskelser. Med dette mener han at språket skal være fritt for feller og inkonsekvenser som preger andre språk.
Ruby er objektorientert, som vil si at alle databiter er et objekt. Dette omfatter typer, som andre språk ofte definerer som primitive datatyper, som for eksempel etheltall. Hver funksjon er en metode. Alle variabler er en referanse til et objekt, og ikke objektet selv. Ruby støtter arv og import av moduler som såkalteMixIns (å endre deler av funksjonaliteten i en klasse). Prosedyre-syntaks er inkludert, men alle slike prosedyrer skrevet utenfor en selvdefinert klasse blir gjort på klassen av type Object. Siden denne klassen er forelder til alle andre klasser, blir slike prosedyrer synlige for alle klasser og objekter.
Det finnes flere vanlige implementasjoner av Ruby. Den offisielle Ruby-tolkeren, ofte kalt MRI (Matz’ Ruby Implementation), er den mest utbredte etter Ruby versjon 1.9 (denne basert påYARV, en virtuell maskin-implementasjon som skal gi høyere ytelse).[3]JRuby er en versjon basert påJavas virtuelle maskin. Denne integreres lett med Java-baserte tjenerløsninger som for eksempelTomcat ogGlassfish, og kan sømløst kalle Java-API-er fra Ruby og vice versa.[4]Tilsvarende finnes ogsåIronRuby, som kjører på.NET-/Mono-plattformen.Rubinius er en implementasjon basert påLLVM som virtuell maskin. OgsåMacRuby er basert på LLVM, men er kun tilgjengelig forApples eget operativsystem,macOS. MacRuby har som mål å være et alternativ tilObjective-C som utviklingsmiljø på Mac.[5]
Ruby blir distribuert underGPL ogRuby LicenseArkivert 26. august 2011 hosWayback Machine.. De øvrige implementasjonene distribueres under en rekke forskjellige lisenser for åpen kildekode.
Ruby støtter utvikling basert på klasser, og klasser kan arve hverandre:
class Person def set_name(n) @name = n end def name @name endendclass Worker < Person def set_title(t) @title = t end def title @title endend
Vi kan nå instansiere en arbeider slik:
w = Worker.neww.set_name("Petter")w.set_title("Overbuljongterningpakkmesterassistent")
Siden arbeideren er en person, har han et navn:
w.name=> "Petter"
Han har også en tittel:
w.title=> "Overbuljongterningpakkmesterassistent"
Vi kan spørre om objektet (arbeideren vår) er av en gitt klasse:
w.instance_of? Worker=> true
Vi kan også spørre om objekter er av, eller arvet av en gitt klasse:
w.is_a? Person=> true
Klasser som ikke oppgir en moderklasse arver automatisk klassen Object. Ruby støtter ikkemultippel arv, men gjør bruk av såkaltemixins som lar en klasse gjøre bruk av andre klasser selv om de ikke arver dem direkte.
Ruby definerer en rekke avviksklasser, og støtter også brukerdefinerte avvik. Avvik fanges opp av enrescue-linje i enbegin –end-blokk, eller i en metodedefinisjon:
MyError = Class.new(RuntimeError)def smell raise MyError.new("Pang!")enddef safe_method smell puts "Denne linjen vil aldri kjøres..."rescue RuntimeError => ex puts ex.message puts ex.classend
Kjører visafe_method vil ruby svare slik:
Pang!MyError
Kjører vi imidlertidsmell direkte, så fanger vi ikke feilen og ruby skriver ut feilinformasjon og avslutter programmet.
Ruby mangler, per dags dato, full støtte forUnicode, men har delvis støtte forUTF-8. I versjon 2.0 er målet full støtte av unicode-strenger.
Selv om Ruby er utformet etter prinsippet omfærrest mulige overraskelser er det store forskjeller fra andre språk somC ogPerl.
Lokale variabler må ha navn som starter med små bokstaver, ellers blir de betraktet som konstanter.
0, "" (tom streng) og [] (tom liste/array) evalueres til sant (true). I C blir uttrykket 0 ? 1 : 0 tolket som 0. I Ruby blir dette tolket som 1.
For å indikere flyttall er det ikke nok å legge til et punktum (99.). Fordi nummer kan forveksles med metoder må man legge til en ekstra null (99.0) eller oppgi konverteringen eksplisitt (99.to_f).
Det er ingen egen datatype for skrifttegn. I Ruby versjon 1.8 og tidligere kunne dette føre til et uventet resultat ved avkutting av strenger: ”abc”[0] ga 97 som er den numeriske ASCII-koden for det første tegnet i strengen. I Ruby versjon 1.9 og senere gir dette resultatet "a" som er mer som ventet.[6]
hash={'water'=>'wet','fire'=>'hot'}putshash['fire']hash.each_pairdo|key,value|puts"#{key} is#{value}"end# Skriver ut: water is wet# fire is hothash.delete_if{|key,value|key=='water'}# Sletter 'water' => 'wet'
defremember&p@block=pend# Sender med en kodeblokk som parameter og navngir denremember{|name|puts"Hello, "+name+"!"}# Kall funksjonen@block.call("Johnny")# Skriver ut "Hello, Johnny!"
Iterere over array og enumeratorer:
a=[1,'hi',3.14]a.each{|item|putsitem}# Skriver ut hvert element(3..6).each{|num|putsnum}# Skriver ut 1 -6.
Blokker fungerer med mange innebygde metoder:
IO.readlines('file.txt')do|line|# gjør noe med linjen her.end
Følgende kode definerer klassen Person. I tillegg til å initialisere den vanlige konstruktøren, har klassen to metoder: En for å overstyre<=>-operatoren for å sortere etter alder. Den andre overstyrerto_s for å få korrekt formatering.