A
A. S. Bradbury
I have a Node class, children are stored in a hash with the node's name as the
key and the child node object as the value. I have the method Node#each_level
that yields each level of the node tree as an array:
def each_level(include_self=false)
if include_self
node_queue=[self]
else
node_queue=self.children.values
end
yield node_queue
while node_queue.any? {|node| node.children.empty? == false} do
node_queue.collect! {|node| node.children.values}
node_queue.flatten!
yield node_queue
end
end
Here is the code that demonstrates the problem:
require 'ariel'
root=Ariel::Node.new :root
child1=Ariel::Node.new :child1
child2=Ariel::Node.new :child2
child1_1=Ariel::Node.new :child1_1
root.add_child child1
root.add_child child2
child1.add_child child1_1
results=[]
puts "Results when making an array then flattening it"
root.each_level do |level|
puts "Yielded #{level.inspect}"
puts
raise StandardError unless level.kind_of? Array
results << [level].flatten # works
end
puts "results=#{results.inspect}"
puts
results=[]
puts "Results when just adding the array"
root.each_level do |level|
puts "Yielded #{level.inspect}"
puts
raise StandardError unless level.kind_of? Array
raise StandardError if level.any? {|val| val.kind_of? Array}
results << level # doesn't work
end
puts "results=#{results.inspect}"
I'm really, really stumped. Here's the output:
The yielded data is always correct and the same each time, but as you can see
the second results array is wrong. Can anyone explain what's going on here?
Alex
key and the child node object as the value. I have the method Node#each_level
that yields each level of the node tree as an array:
def each_level(include_self=false)
if include_self
node_queue=[self]
else
node_queue=self.children.values
end
yield node_queue
while node_queue.any? {|node| node.children.empty? == false} do
node_queue.collect! {|node| node.children.values}
node_queue.flatten!
yield node_queue
end
end
Here is the code that demonstrates the problem:
require 'ariel'
root=Ariel::Node.new :root
child1=Ariel::Node.new :child1
child2=Ariel::Node.new :child2
child1_1=Ariel::Node.new :child1_1
root.add_child child1
root.add_child child2
child1.add_child child1_1
results=[]
puts "Results when making an array then flattening it"
root.each_level do |level|
puts "Yielded #{level.inspect}"
puts
raise StandardError unless level.kind_of? Array
results << [level].flatten # works
end
puts "results=#{results.inspect}"
puts
results=[]
puts "Results when just adding the array"
root.each_level do |level|
puts "Yielded #{level.inspect}"
puts
raise StandardError unless level.kind_of? Array
raise StandardError if level.any? {|val| val.kind_of? Array}
results << level # doesn't work
end
puts "results=#{results.inspect}"
I'm really, really stumped. Here's the output:
Results when making an array then flattening it
Yielded [Ariel::Node - node_name=:child1; parent=:root;
children=[:child1_1];, Ariel::Node - node_name=:child2; parent=:root;
children=[];]
Yielded [Ariel::Node - node_name=:child1_1; parent=:child1; children=[];]
results=[[Ariel::Node - node_name=:child1; parent=:root;
children=[:child1_1];, Ariel::Node - node_name=:child2; parent=:root;
children=[];], [Ariel::Node - node_name=:child1_1; parent=:child1;
children=[];]]
Results when just adding the array
Yielded [Ariel::Node - node_name=:child1; parent=:root;
children=[:child1_1];, Ariel::Node - node_name=:child2; parent=:root;
children=[];]
Yielded [Ariel::Node - node_name=:child1_1; parent=:child1; children=[];]
results=[[Ariel::Node - node_name=:child1_1; parent=:child1;
children=[];], [Ariel::Node - node_name=:child1_1; parent=:child1;
children=[];]]
The yielded data is always correct and the same each time, but as you can see
the second results array is wrong. Can anyone explain what's going on here?
Alex