Sorry Robert but I do not think I made myself too clear
we now about each_byte and I already combined your #chr and String#each_byte
so we had already established
"Ty Mr. Klemme".each_byte { |b| puts b.chr }
which is pretty elegant, don't you agree?
So Enumerators are not needed.
Duck typing?
require 'enumerator'
def just_iterate(obj)
obj.each { |e| p e }
end
just_iterate("abc")
# (prints) "abc"
just_iterate("abc".enum_for(:each_byte))
# (prints) 97
# 98
# 99
Now after that we switched discussing the behaviour of String#each and I
*really* feal that String#each should us give that kind of behaviour.
As I see that a lot of people think that the current behaviour of
String#each is a good one, and changing it would not be an option anyway I
thaught that the only solution would be to enhance the behaviour of
String#each.
The idea for that behaviour comes from Ruby itself (look at IO#gets)
then
"Ty Mr. Klemme".each_byte { |b| puts b.chr }
would be the same as
"Ty Mr. Klemme".each( 1 ) { |b| puts b }
There is always more than one way to do it
Umm, there's *already* more than one way to do it But Enumerator
really is a very useful class:
"abc\ndef\nghi\njkl".each { |e| p e }
# "abc\n"
# "def\n"
# "ghi\n"
# "jkl"
"abc\ndef\nghi\njkl\n".enum_for(:each_byte).each { |e| p e.chr }
# "a"
# "b"
# "c"
# "\n"
# "d"
# "e"
# etc.
"abc\ndef\nghi\njkl\n".enum_slice(2).each { |e| p e }
# ["abc\n", "def\n"]
# ["ghi\n", "jkl\n"]
"abc\ndef\nghi\njkl\n".enum_for(:each_byte).enum_slice(2).each { |e| p e }
# [97, 98]
# [99, 10]
# [100, 101]
And crucially:
"abc\ndef\nghi\njkl\n".enum_for(:each_byte).enum_slice(2).map do |(a,b)|
(a + b).chr
end
# => ["\303", "m", "\311", "p", "\317", "s", "\325", "v"]
How would map and other Enumerable methods work if 'each' needed
arguments?
···
On Tue, 2006-03-21 at 18:47 +0900, Robert Dober wrote:
--
Ross Bamford - rosco@roscopeco.REMOVE.co.uk