Ruby

Fra Wikipedia, den frie encyklopedi

Gå til: navigasjon, søk
«Ruby» har flere betydninger.

Ruby er et objektorientert programmeringsspråk. Det kombinerer syntaks inspirert av Perl med Smalltalk sine objektorienterte egenskaper. Det deler også egenskaper med Python, Lisp, Dylan og CLU. Ruby er et tolket programmeringsspråk. Hovedimplementasjonen er fri programvare.

Innhold

[rediger] Historie

Språket ble laget av Yukihiro "Matz" Matsumoto som startet jobben med Ruby den 24. februar 1993 og lanserte det i 1995. Navnet «Ruby» ble valgt etter en kollega sin fødselsdagsstein - en Rubin.

[rediger] Filosofi

I følge forfatteren ble Ruby utformet etter prinsippet om fæ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: Alle biter av data er et objekt. Dette omfatter typer som andre språk ofte definerer som primitive datatyper, slik som for eksempel et heltall. 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åkalte MixIns (å 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.

[rediger] Implementasjoner

Ruby har to hovedimplementasjoner: Den offisielle Ruby-tolkeren, som er den mest utbredte, og JRuby, som er en Java-basert implementasjon.

[rediger] Lisensiering

Ruby blir distribuert under GPL og Ruby License [1].

[rediger] Egenskaper

  • Objektorientert
  • Avvikshåndtering
  • Iteratorer
  • Å sende blokker av kode som parameter
  • Closures
  • Overstyring av operatorer
  • Automatisk fjerning av objekt som ikke lenger er i bruk (garbage collection)
  • Flertrådshandtering
  • Lasting av DLL-bibliotek (under Microsoft Windows)
  • Introspection og reflection.
  • Stort standardbibliotek.
  • Støtter innsetting av avhengigheter.

Ruby mangler, per dags dato, full støtte for Unicode, men har delvis støtte for UTF-8. I versjon 2.0 er målet full støtte av unicode-strenger.

[rediger] Mulige overraskelser

Selv om Ruby er utformet etter prinsippet om færrest mulige overraskelser er det store forskjeller fra andre språk som C og Perl.

  • 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. Dette kan føre til uventet resultat ved avkutting av strenger: ”abc”[0] gir 97 som er den numeriske ASCII-koden for det første tegnet i strengen.

[rediger] Eksempler

Et klassisk Hello World-eksempel:

puts "Hello World!"

Litt grunnleggende Ruby-kode:

# Alt er objekter
-199.abs                                       # 199
"ruby is cool".length                          # 12
"Rick".index("c")                              # 2
"Nice Day Isn't It?".split(//).uniq.sort.join  # " '?DINaceinsty"

[rediger] Lister

Et array:

a =[1, 'hi', 3.14, 1, 2, [4, 5]]
 
a[2]                      # 3.14
a.reverse                 # [[4, 5], 2, 1, 3.14, "hi", 1]
a.flatten.uniq            # [1, "hi", 3.14, 2, 4, 5]

En hash-tabell:

hash = {'water' => 'wet', 'fire' => 'hot'}
puts hash['fire']        
 
hash.each_pair do |key, value| 
  puts "#{key} is #{value}"
end
 
# Skriver ut:             water is wet
#                     fire is hot
 
hash.delete_if {|key, value| key == 'water'}   # Sletter 'water' => 'wet'

[rediger] Blokker og iteratorer

To måter å opprette en kodeblokk:

{puts "Hello, World!"}
 
do puts "Hello, World!" end

Sende en blokk som parameter:

def remember &p
  @block =p
end
# Sender med en kodeblokk som parameter og navngir den
remember {|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| puts item}     # Skriver ut hvert element
(3..6).each {|num| puts num}       # Skriver ut 1 -6.

Blokker fungerer med mange innebygde metoder:

IO.readlines('file.txt') do |line|
  # gjør noe med linjen her.
end

Kvadrere 1 til 10:

(1..10).collect {|x| x*x}    => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

[rediger] Klasser

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 overstyrer to_s for å få korrekt formatering.

class Person
  def initialize(name, age)
    @name, @age = name, age
  end
 
  def <=>(person)
    @age <=> person.age
  end
 
  def to_s
    "#{@name} (#{@age})"
  end
 
  attr_reader :name, :age
end
 
group = [ Person.new("John", 20), 
          Person.new("Markus", 63), 
          Person.new("Ash", 16) 
        ]
 
puts group.sort.reverse

Koden over skriver ut en liste sortert med den eldste først:

Markus (63)
John (20)
Ash (16)

[rediger] Eksterne lenker

Personlige verktøy
Opprett en bok