Ruby is...

A dynamic, open source programming language with a focus on simplicity and productivity. It has an elegant syntax that is natural to read and easy to write.

# The Greeter class
class Greeter
  def initialize(name)
    @name = name.capitalize
  end

  def salute
    puts "Hello #{@name}!"
  end
end

# Create a new object
g = Greeter.new("world")

# Output "Hello World!"
g.salute

Alt er objekter

5.times { print "We *love* Ruby -- it's outrageous!" }
class Numeric
  def plus(x)
    self.+(x)
  end
end

y = 5.plus 6
# y is now equal to 11
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.admin?()
      can(:manage, :all)
    else
      can(:read, :all)
    end
  end
end

() yes, no, maybe

class SomeClass
  def initialize(value1)
    @value1 = value1
  end
 
  def value_printer(value2)
    lambda {puts "Value1: #{@value1}, Value2: #{value2}"}
  end
end
 
def caller(some_closure)
  some_closure.call
end
 
some_class = SomeClass.new(5)
printer = some_class.value_printer("some value")
 
caller(printer)

We got closure

Standardverdier som parameter

def sum(a = 1, b = 2, c = 3)
    a + b + c
end

sum 3, 3
=> 9

sum
=> 6

def tables(t = {})
    puts t
end

tables(absolute: true, round: true, precision: 2)
=> "{:absolute=>true, :round=>true, :precision=>2}"

Kun "false" og "nil" er false

x = true
y = x || 2
=> # y == 2

x = nil || y
=> # x == 2

# alt er som nevnt objekter
def nil.quack
    puts "quack quack" 
end
x = nil

x.quack
=> quack quack

Multippel returverdi

def foo(x)
 return x, x+1
end

a, b = foo(10)
#=> [10, 11]
class Publication
  attr_accessor :publisher
end

class Magazine < Publication
  attr_accessor :editor
end

m = Magazine.new
m.publisher = "Time Inc."

m.is_a? Magazine #=> true
m.is_a? Publication #=> true
m.class == Publication #=> false

Single inheritance

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

# p036duck.rb
class Duck
  def quack
    'Quack!'
  end
  
  def swim
    'Paddle paddle paddle...'
  end
end

class Goose
  def honk
    'Honk!'
  end
  def swim
    'Splash splash splash...'
  end
end

class DuckRecording
  def quack
    play
  end
  
  def play
    'Quack!'
  end
end
require_relative 'p036duck.rb'

def make_it_quack(duck)
  duck.quack
end

puts make_it_quack(Duck.new)
# Quack!
puts make_it_quack(DuckRecording.new)
# Quack!

def make_it_swim(duck)
  duck.swim
end

puts make_it_swim(Duck.new)
# Paddle paddle paddle...
puts make_it_swim(Goose.new)
# Splash splash splash...

How do I do that?

Ting man bør vite

Løkker

a = [ "a", "b", "c" ]
a.each {|x| print x, " -- " }
# a -- b -- c --

a = [ "a", "b", "c" ]
a.each_index {|x| print x, " -- " }
# 0 -- 1 -- 2 --

h = { "a" => 100, "b" => 200 }
h.each {|key, value| puts "#{key} is #{value}" }
# a is 100
# b is 200

Funksjoner

def someMethod(value)
  puts "#{Time.now}: #{value}"
end

someMethod('log this with timestamp')
# 2017-05-30 22:17:19 +0200: log this with timestamp

Import av filer

load 'somefile.rb'
# Laster filen på nytt hver gang den blir kalt

require 'sinatra'
# Laster inn bibliotek/fil en gang

require_relative 'libs/my_helper.rb'
# Last inn en fil relativt til hvor filen som kaller den står

Variabler

# Global
$x = 10
defined? $x
# "global-variable"

# Lokale variabler
loopcounter = 10
_LoopCounter = 20

defined? loopcounter
# "local-variable"

# Constant (kinda)
Number = 123
NUMBER = 321
defined? NUMBER
# "constant"
# Class
@@total = 0
defined? @@total
# "class variable"

# Instance
@total = 10
defined? @total
# "instance-variable"

If/else

x = 1
if x > 2
   puts "x is greater than 2"
elsif x <= 2 and x!=0
   puts "x is 1"
else
   puts "I can't guess the number"
end

$debug = 1
print "debug\n" if $debug

x = 1 
unless x>2
   puts "x is less than 2"
 else
   puts "x is greater than 2"
end

$var =  1
print "1 -- Value is set\n" if $var
print "2 -- Value is set\n" unless $var

$var = false
print "3 -- Value is set\n" unless $var
$age =  5
case $age
when 0 .. 2
   puts "baby"
when 3 .. 6
   puts "little child"
when 7 .. 12
   puts "child"
when 13 .. 18
   puts "youth"
else
   puts "adult"
end

Sweet regex

IRB = Interactive Ruby Shell

% irb
irb(main):001:0> 1 + 1
2
irb(main):002:0> def t(x)
irb(main):003:1> x+1
irb(main):004:1> end
=> nil
irb(main):005:0> t(3)
=> 4
irb(main):006:0> if t(3) == 4
irb(main):007:1> p :ok
irb(main):008:1> end
:ok
=> :ok
irb(main):009:0> quit
%

#!/usr/bin/ruby

Gem

source 'https://rubygems.org'

ruby '2.4.1'

gem 'rails', '~> 5.0'

gem 'pg', '~> 0.20'

# Use Puma as the app server
gem 'puma', '~> 3.8'

gem 'haml', '~> 4.0'
gem 'redcarpet', '~> 3.4'
gem 'uglifier', '~> 3.1'
gem 'therubyracer', '~> 0.12'
gem 'pikaday-gem', '~> 1.4'
gem 'jquery-rails', '~> 4.3'
gem 'turbolinks', '~> 2.5'

group :production do
  # To enable features such as static asset serving and logging on Heroku
  gem 'rails_12factor', '~> 0.0'
end

# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1'

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', '~> 9.0'
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> in views
  gem 'web-console', '~> 3.3'
  # Spring speeds up development by keeping your application running in the background.
  # Read more: https://github.com/rails/spring
  gem 'spring', '~> 2.0'
end

JRuby

# This is the 'magical Java require line'.
require 'java'

# With the 'require' above, we can now refer to things that are part of the
# standard Java platform via their full paths.
frame = javax.swing.JFrame.new("Window") # Creating a Java JFrame
label = javax.swing.JLabel.new("Hello")

# We can transparently call Java methods on Java objects, just as if 
# they were defined in Ruby.
frame.add(label)  # Invoking the Java method 'add'.
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack
frame.setVisible(true)

Ruby på Windows

Spørsmål?

Ruby is...

By Kyrre Havik

Ruby is...

  • 209