>>>>> "George" == George Ogata <g_ogata / optushome.com.au> writes:
George> We have methods corresponding to the iterator/collector methods to set the
George> one that #each points to: #useBytes, #useChars (or #useCharacters),
George> #useWords, #useLines, #usePars (or #useParagraphs).
[...]
George> s = "abc\ndef\nghi"
George> s.useChars
George> s.collect {|char| frob char} # iterates over chars
George> s.useLines
George> s.collect {|line| frob line} # now it iterates over lines
The only problem I have with this suggestions is that
useChars/useLines/etc are state changing methods that affect the
behavior of "each" later in the program. Using "useChars" at one
point may break a portion of code that assumes a line by line version
of each.
How about something like this.
s = "abc\ndef\nghi"
s.by_chars.collect { |char| frob char }
s.by_lines.collect { |line| frob line }
The methods by_chars/by_lines return an appropriate adapter object
that does the indicated type of iteration over the target string.
This means that there is no state information in a string that needs
to change. The original s.each can continue to work as currently
defined to avoid breakage.
--
-- Jim Weirich jweirich / one.net http://w3.one.net/~jweirich
---------------------------------------------------------------------
"Beware of bugs in the above code; I have only proved it correct,
not tried it." -- Donald Knuth (in a memo to Peter van Emde Boas)