„Freiheit oder Tod“
 
Ruby entered my brain in 2004 when I bought a book about it. I was curious but obviously not curious enough to learn it so I basically don’t know a shit anymore and I’m sure I don’t even read the whole book (as always, hello scala!).

However, ruby is not so special if you already know another programming or scripting language and I started becoming interested again, so here we are:

assigning variables
my_super_cool_variable = "some string value"
puts my_super_cool_variable
 
print "6^2 = "+(6**2).to_s
Oh, see, converting between string and integer values is actually very easy. Just append .to_i or .to_s and you are done.

Arrays
cars = ["Audi","BMW","Mercedes","Lexus"]
p cars
puts cars[0]
puts cars
puts cars.length
puts cars.reverse
puts cars[0..cars.length]
 
for run in (0..cars.length)
  puts cars[run]
end
Add elements to your array
cars = ["Audi","BMW","Mercedes","Lexus"]
p cars
cars << "Saab"
p cars


getting user input
car = gets
print car

reading a file
file_contents = File.read("/etc/resolv.conf")
print file_contents

writing to a file
print "enter your first name: "
file_handle = File.new("/tmp/foobar", "w")
first_name = gets
file_handle.puts first_name
file_handle.close
It asks for your first name and writes it to /tmp/foobar. “cat” the file after executing this script. Your name will be in it. Easy peasy!

simple functions / methods
def foobar
  puts "foobar"
end
 
foobar # prints "foobar\n"
def greet(firstname, lastname)
  puts "Welcome "+firstname+" "+lastname
end
 
greet("Andreas","Schipplock")
def greet(*family)
  p family
end
 
greet("Oma","Opa","Tante","Cousine")


simple prototype based object orientation
car = Object.new
 
def car.drive 
 puts "driving along the road"
end
 
def car.speedup(speed)
  puts "speeding up to "+speed.to_s+" km/h"
end
 
def car.mileage
  return 120000
end
 
def car.started?
  return false
end
 
def car.id
  return self.object_id
end
 
def car.add_features(*features)
  p features # p = print for arrays
end
 
def car.default_climate_value(temperature=20)
  return temperature
end
 
car.drive
car.speedup(140)
puts car.mileage.to_s
puts car.started?.to_s
puts car.id.to_s
car.add_features("air cooling", "automatic transmission", "foobar")
puts car.default_climate_value.to_s
puts car.default_climate_value(25).to_s
 
if car.respond_to?("turn_turbo_on")
  car.turn_turbo_on
else
  puts "sorry, this car doesn't have a turbo"
end
 
print "what do you want the car to do now? -> "
method = gets.chomp
 
if car.respond_to?(method)
  car.send(method)
else
  puts "sorry, the car can't do that"
end
executing this script could look like this:
andreas_schipplock@andreas:~/projects/ruby$ ruby1.9.1 c2f.rb 
driving along the road
speeding up to 140 km/h
120000
false
74485320
["air cooling", "automatic transmission", "foobar"]
20
25
sorry, this car doesn't have a turbo
what do you want the car to do now? -> drive
driving along the road
andreas_schipplock@andreas:~/projects/ruby$


a simple class
class Car
  def speedup
    return true
  end
end
 
audi = Car.new
if audi.speedup
  puts "yo, dawg, I'm speeding up"
else
  puts "eh, mother*, I'm an old lady"
end
a little more advanced example of a class
class Car
  def initialize(build_year,mileage)
    @build_year = build_year
    @mileage = mileage
    @ready = true
  end
 
  def speedup(speed)
    @current_speed = speed
  end
 
  def current_speed
    return @current_speed
  end
 
  def ready?
    return @ready
  end
 
  def age
    return (Time.new).year - @build_year
  end
 
  def mileage
    return @mileage
  end
end
 
audi = Car.new(1989,245000)
if audi.ready?
  audi.speedup(140)
  puts audi.current_speed
  audi.speedup(220)
  puts audi.current_speed
  puts "age: "+audi.age.to_s
  puts "mileage: "+audi.mileage.to_s
end
The variables with the @-sign are properties or instance variables that are available inside the class. The example demonstrates their state inside the class. The “initialize” method is the constructor and is called whenever you create a new instance “audi = Car.new”.

get and setter methods
class Car
  def initialize(mileage)
    @mileage = mileage
  end
 
  def mileage=(miles)
    @mileage = miles
  end
 
  def mileage
    @mileage
  end
end
 
audi = Car.new(245000)
puts "old mileage: "+audi.mileage.to_s
audi.mileage = 246000
puts "new mileage: "+audi.mileage.to_s

You can shorten that:
class Car
  attr_reader :mileage
  attr_writer :mileage
 
  def initialize(mileage)
    @mileage = mileage
  end
end
 
audi = Car.new(245000)
puts "old mileage: "+audi.mileage.to_s
audi.mileage = 246000
puts "new mileage: "+audi.mileage.to_s

And even shorter…
class Car
  attr_accessor :mileage
 
  def initialize(mileage)
    @mileage = mileage
  end
end
 
audi = Car.new(245000)
puts "old mileage: "+audi.mileage.to_s
audi.mileage = 246000
puts "new mileage: "+audi.mileage.to_s
“attr_reader :mileage” unfolds to:
def mileage
  @mileage
end
“attr_writer :mileage” unfolds to
def mileage=(miles)
  @mileage = miles
end
“attr_accessor :mileage” unfolds to
def mileage=(miles)
  @mileage = miles
end
 
def mileage
  @mileage
end


Inheritance
class Car
  def type
    @type = "rwd"
  end
end
 
class Audi < Car
  def type
    @type = "awd"
  end
end
 
my_car = Audi.new
puts my_car.type
Outputs “awd”.

Inheritance with constants
class Car
  TYPES = ["AWD", "RWD", "FWD"]
  def type
    @type = self::TYPES[1]
  end
end
 
class Audi < Car
  def type
    @type = Car::TYPES[0]
  end
end
 
my_car = Audi.new
puts my_car.type