Topic: Blocks

def grandfatherClock &block
    currentTime = Time.now.strftime("%I")
    currentTimeI = currentTime.to_i
    total = ((1)..(currentTimeI)).to_a
    total.each do |t|
        puts 'The time now is ' + t.to_s + ' O\' Clock'
        block.call
    end
end

grandfatherClock do
    puts 'dong'
end

grandfatherClock do
    puts 'ding'
end


I've coded the click something like this to achieve:

Grandfather Clock. Write a method which takes a block and calls it once for each hour that has passed today. That way, if I were to pass in the block do puts 'DONG!' end, it would chime (sort of) like a grandfather clock. Test your method out with a few different blocks (including the one I just gave you). Hint: You can use Time.now.hour to get the current hour. However, this returns a number between 0 and 23, so you will have to alter those numbers in order to get ordinary clock-face numbers (1 to 12).

rtices
What would you do? I'm a beginner and wants to learn best practices. smile

Last edited by Haris (2007-08-02 19:19:34)

Re: Blocks

You're almost there. You just need to implement the hint. Figure out the pattern you need to convert a 24 hour clock to a 12 hour clock and you'll have almost finished the method.

What math would you use to convert the number in the left column to the corresponding number in the right column?

Time.now.hour,    # times to chime
0  1
1  2
2  3
3  4
4  5
5  6
6  7
7  8
9  10
10  11
11  12
-------
12  1
13  2
14  3
15  4
16  5
17  6
18  7
19  8
20  9
21  10
22  11
23  12


---------------
EDIT: I see that you've gotten past that part already. If you want to continue using strftime():

Time.now.strftime("%I").to_i.times do
  block.call
end

Last edited by vwoo (2007-08-02 20:00:20)

Vincent Woo Ruby on Rails Blog

Re: Blocks

def blck string, &block
    puts 'Block ' + string + ' starts..'
    puts 'Rendered:' + block.call.to_s
    puts 'Block ' + string + ' ends..'
end

blck '31' do
    puts 'Hi'
end


How can I make block.call not to become nil when called as a string?

Re: Blocks

def blck string, &block
  puts 'Block ' + string + ' starts..'
  puts 'Rendered:' + block.call
  puts 'Block ' + string + ' ends..'
end

blck '31' do
  # The last value here is returned to blck()
  'Hi'
end

Vincent Woo Ruby on Rails Blog

Re: Blocks

vwoo wrote:

def blck string, &block
  puts 'Block ' + string + ' starts..'
  puts 'Rendered:' + block.call
  puts 'Block ' + string + ' ends..'
end

blck '31' do
  # The last value here is returned to blck()
  'Hi'
end

How would I go about doing a block into a block?

def blck string, &block
puts 'Block ' + string + ' starts..'
puts 'Rendered:' + block.call
puts 'Block ' + string + ' ends..'

if def sblck sstring, &sblock
puts 'Small Block ' + sstring + ' starts..'
puts 'Rendered:' + sblock.call
puts 'Small Block ' + sstring + ' ends..'
end

end

blck '31' do
   'Hi'

sblck 'mulitply' do
    number = 10
    (number * 5).to_s
end

end

Re: Blocks

sblck() is a repeat of blck() so it isn't necessary. You could call blck() as many times as you need to.

def blck string, &block
  puts 'Block ' + string + ' starts..'
  puts 'Rendered:' + block.call
  puts 'Block ' + string + ' ends..'
end



blck '31' do
  'Hi'
end

# Output:
# Block 31 starts..
# Rendered:Hi
# Block 31 ends..



blck 'multiply' do
  number = 10
  (number * 5).to_s
end

# Output:
# Block multiply starts..
# Rendered:50
# Block multiply ends..


But you could call a method from any other method:
def print_once &blk
  p blk.call
end

def print_twice &blk
  message = blk.call
  print_once {message}  # A way to define short code blocks is with {}.
  print_once {message}
end



print_once {"This is a message"}
# "This is a message"

print_twice {"ditto"}
# "ditto"
# "ditto"

Last edited by vwoo (2007-08-03 15:17:47)

Vincent Woo Ruby on Rails Blog

Re: Blocks

Here's my solution to the grandfather clock problem:

https://gist.github.com/2760616