Skip to content
Subhas Dandapani edited this page Jan 24, 2015 · 12 revisions

Exercise:

a1 = [1,2,3,4]
a2 = a1.map do |item|
        return item+1
     end

puts a2
# Why? How?

Workshop Code Examples:

Time measurement

def measure
  t1 = Time.new
  yield 1
  yield 2
  yield 3
  t2 = Time.new
  puts t2-t1
end
measure do |x|
  puts "this block got #{x}"
end

### Ruby Array `each` also uses blocks

```ruby
[5,6,7,8].each do |i|
  puts "got #{i}"
end

Transaction commit, rollback upon error

def with_transaction
  begin
    puts "begin transaction"
    yield
    puts "commit transaction"
  rescue
    puts "rollback transaction"
  end
end

with_transaction do
  puts "execute query 1"
  put "calculate something" # purposeful error
  puts "execute query 2"
end

with_transaction do
  puts "execute query 3"
  puts "calculate something again"
  puts "execute query 4"
end

Custom DSL for Writing Excel

excel_dsl.rb

require 'writeexcel'
def workbook(filename, person)
  @workbook = WriteExcel.new(filename)
  @person = person
  yield
  @workbook.close
end
def worksheet(sheet_name)
  @worksheet = @workbook.add_worksheet(sheet_name)
  @row = 0
  yield
end
def row(label, column_name=nil)
  if column_name
    value = @person[column_name]
  else
    value = yield
  end

  @worksheet.write @row, 0, label
  @worksheet.write @row, 1, value
  @row = @row + 1
end

excel_new.rb

require './excel_dsl'

person = {
  "first_name" => "Subhas",
  "last_name" => "D",
  "company" => "TW",
  "date_of_birth" => "...",
  "experience" => "0",
  "languages" => "ruby"
}

workbook('ruby.xls', person) do
  worksheet('Personal Details') do
    row "Name" do
      @person['first_name'] + ',' + @person['last_name']
    end
  end
  worksheet('Company Details') do
    row "Company", "company"
  end
  worksheet('Skills') do
    row 'Languages', "languages"
  end
end

Clone this wiki locally