Forum: Ruby About blocks

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Surgeon (Guest)
on 2006-01-02 13:54
(Received via mailing list)
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.
unknown (Guest)
on 2006-01-02 18:15
(Received via mailing list)
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!
http://www.manning.com/books/black
Robert K. (Guest)
on 2006-01-02 18:15
(Received via mailing list)
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
unknown (Guest)
on 2006-01-02 18:15
(Received via mailing list)
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!
http://www.manning.com/books/black
Michael 'entropie' Trommer (Guest)
on 2006-01-02 21:57
(Received via mailing list)
* 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"
This topic is locked and can not be replied to.