What's wrong with either:
arrayofA.each do |e|
i,v = e.i,e.v
p i,v
end
or
arrayofA.collect { |e| [e.i,e.v] }.flatten.each { |i,v| p i,v }
or
class << arrayofA
def eachA
each {|e| yield, e.i, e.v }
end
end
if such a thing a "splat" were to be implemented, it would probably be
done by changing the "flatten" method to check whether the contents
respond to flatten instead of just recursively flattening arrays:
class Array
def flatten
a = []
each do |x|
if a.respond_to? :flatten
x.flatten.each { |y| a << y }
else
a << x
end
end
a
end
end
···
-----Original Message-----
From: Trans [mailto:transfire@gmail.com]
Sent: Monday, 26 September 2005 2:42 PM
To: ruby-talk ML
Subject: How each class splats
First I'll just ask it there's a way to do this WITHOUT redefining #each
in Array.
class A
def initialize(i,v)
@i,@v=i,v
end
end
arrayofA = [ A.new(:a,1), A.new(:b,2) ]
arrayofA.each { |e| p e }
=> #<A @i=:a,@v=1>
#<A @i=:b,@v=2>
arrayofA.each { |i,v| p i,v }
=> :a
1
:b
2
If thsi is not possible, what do people think of allowing a class to
define a #splat method to determine how it will splat into an each block
(and perhaps other things).
class A
def initialize(i,v)
@i,@v=i,v
end
def splat( arity )
case arity
when 1 then self
when 2 then [@i,@v]
else
[@i,@v].concat( [nil]*(arity-2) )
end
end
end
Or something to that effect.
Thanks,
T.
#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################