About blocks


#1

Hi,

(This question might be answered previously. If so, I apologize.)

Can we ALWAYS use plain methods instead of blocks? Yes, sometimes
using a block may be obviously better than using a method but I mean,
are there any situations in which the ONLY solution is to use a block
rather than a method? May someone be forced to use only and only a
block? I ask this because I am not very intelligent and I am not sure
that I will thoroughly understand the “block” concept.


#2

Hi –

On Mon, 2 Jan 2006, Surgeon wrote:

Hi,

(This question might be answered previously. If so, I apologize.)

Can we ALWAYS use plain methods instead of blocks? Yes, sometimes
using a block may be obviously better than using a method but I mean,
are there any situations in which the ONLY solution is to use a block
rather than a method? May someone be forced to use only and only a
block? I ask this because I am not very intelligent and I am not sure
that I will thoroughly understand the “block” concept.

You don’t really use methods instead of blocks; you use methods –
that is, you call methods – with or without providing a code block
for a given method call.

The block is part of the method call syntax, along with the method
name and the argument list. Whether or not it’s mandatory is up to
the method (as with arguments). For example:

def x
end

def y
yield
end

def z
yield if block_given?
end

x # OK – no block expected or given
x { puts “code block” } # block OK but ignored

y # error, because no block to yield to
y { puts “code block” } # OK

z # OK – no yield will be attempted
z { puts “code block” } # also OK, and block will execute

David


David A. Black
removed_email_address@domain.invalid

“Ruby for Rails”, from Manning Publications, coming April 2006!


#3

Hi –

On Mon, 2 Jan 2006, Robert K. wrote:

not sure that I will thoroughly understand the “block” concept.
attr_accessor :comparator
def each
sort!(&comparator)
super(&b)

I think you need either:

def each(&b)

or just:

super # this seems to propagate the block, at least in 1.8.3
# (I think this might have changed, but not sure.)

David


David A. Black
removed_email_address@domain.invalid

“Ruby for Rails”, from Manning Publications, coming April 2006!


#4

Surgeon removed_email_address@domain.invalid wrote:

Hi,

(This question might be answered previously. If so, I apologize.)

Can we ALWAYS use plain methods instead of blocks? Yes, sometimes
using a block may be obviously better than using a method but I mean,
are there any situations in which the ONLY solution is to use a
block rather than a method? May someone be forced to use only and
only a block? I ask this because I am not very intelligent and I am
not sure that I will thoroughly understand the “block” concept.

You need blocks everywhere you need an anonymous callback function such
as
with iterations:

an_array.each {|e| … }

And you need lambdas (i.e. blocks converted to an object) if you need to
store the thing in a variable:

class SortedArray < Array
attr_accessor :comparator
def each
sort!(&comparator)
super(&b)
end
end

Does that help?

Kind regards

robert

#5
  • removed_email_address@domain.invalid (removed_email_address@domain.invalid) wrote:

are there any situations in which the ONLY solution is to use a block
the method (as with arguments). For example:
end

David

really intresting lecture!


David A. Black
removed_email_address@domain.invalid

“Ruby for Rails”, from Manning Publications, coming April 2006!
http://www.manning.com/books/black

So long

Michael ‘entropie’ Trommer; http://ackro.org

ruby -e “0.upto((a=‘njduspAhnbjm/dpn’).size-1){|x| a[x]-=1}; p
‘mailto:’+a”