# Method that generate block?

**URL:** <https://www.ruby-forum.com/t/method-that-generate-block/125500>\
**Category:** Ruby\
**Created:** [January 9, 2008, 6:36pm UTC](https://www.ruby-forum.com/t/method-that-generate-block/125500 "2008-01-09T18:36:08Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![xain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/82dd89/32.png) [@xain](https://www.ruby-forum.com/u/xain)\
**Post date:** [January 9, 2008, 6:36pm UTC](https://www.ruby-forum.com/t/method-that-generate-block/125500/1 "2008-01-09T18:36:08Z")

</div>

Hi, could anyone tell me how to code a method/methods that generates  
these blocks? thanks.  
vds[0].each do |d0|  
vds[1].each do |d1|  
…  
vds[n].each do |dn|  
ds = [d0, d1…, dn]  
create\_new\_filter(ds)  
end  
end  
…  
end

---

<div class="post-metadata">

**Author:** ![xain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/82dd89/32.png) [@xain](https://www.ruby-forum.com/u/xain)\
**Post date:** [January 9, 2008, 6:50pm UTC](https://www.ruby-forum.com/t/method-that-generate-block/125500/2 "2008-01-09T18:50:33Z")

</div>

0…10.times do |time|  
vds[time].each do |my\_var|  
ds = \<\< my\_var  
end  
end

create\_new\_filter(ds)

* * *

I didn’t test.

---

<div class="post-metadata">

**Author:** ![xain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/82dd89/32.png) [@xain](https://www.ruby-forum.com/u/xain)\
**Post date:** [January 10, 2008, 6:53am UTC](https://www.ruby-forum.com/t/method-that-generate-block/125500/3 "2008-01-10T06:53:20Z")

</div>

Ckvok K. wrote:

> 0…10.times do |time|  
> vds[time].each do |my\_var|  
> ds = \<\< my\_var  
> end  
> end
> 
> create\_new\_filter(ds)
> 
> * * *
> 
> I didn’t test.

thanks,but yours will only create one filter, and I want to create  
vds[0].size_vds[1].size_…\*vds[n].size filters, basing on every ds  
value. Each ds value is a arrary that contains one value from the vds  
array.

I mean this:  
n = vds.size  
dss = []  
vds[0].each do |d0|  
vds[1].each do |d1|  
…  
vds[n].each do |dn|  
dss \<\< [d0, d1, … , dn]  
end  
…  
end  
end

dss.each {|ds| create\_filter(ds) }

---

<div class="post-metadata">

**Author:** ![xain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/82dd89/32.png) [@xain](https://www.ruby-forum.com/u/xain)\
**Post date:** [January 10, 2008, 11:16am UTC](https://www.ruby-forum.com/t/method-that-generate-block/125500/4 "2008-01-10T11:16:27Z")

</div>

> I mean this:  
> n = vds.size  
> dss = []  
> vds[0].each do |d0|  
> vds[1].each do |d1|  
> …  
> vds[n].each do |dn|  
> dss \<\< [d0, d1, … , dn]  
> end  
> …  
> end  
> end

OK, now I know I just need a cartesian product method and I’ve got one  
from [Cartesian product of arrays - Ruby - Ruby-Forum](http://www.ruby-forum.com/topic/95519#615075) :

def cart\_prod( \*args )  
args.inject([[]]){|old,lst|  
new = []  
lst.each{|e| new += old.map{|c| c.dup \<\< e }}  
new  
}  
end

The problem is this method take arrays as argument, how can I pass into  
only one array as argument? (this one array will contains sub arrays  
that I want to make a cartesian product from, for example: vds =  
[[1,2],[“a”,“b”]], how to pass the vds array into the method to get  
cartesian product of [1,2] and [“a”,“b”]?)

---

<div class="post-metadata">

**Author:** ![xain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/82dd89/32.png) [@xain](https://www.ruby-forum.com/u/xain)\
**Post date:** [January 10, 2008, 2:47pm UTC](https://www.ruby-forum.com/t/method-that-generate-block/125500/5 "2008-01-10T14:47:35Z")

</div>

Paolo B. wrote:

> Remove the \* from \*args.
> 
> Paolo

it works! thanks!

---

<div class="post-metadata">

**Author:** ![xain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/82dd89/32.png) [@xain](https://www.ruby-forum.com/u/xain)\
**Post date:** [January 10, 2008, 2:30pm UTC](https://www.ruby-forum.com/t/method-that-generate-block/125500/6 "2008-01-10T14:30:48Z")

</div>

> that I want to make a cartesian product from, for example: vds =  
> [[1,2],[“a”,“b”]], how to pass the vds array into the method to get  
> cartesian product of [1,2] and [“a”,“b”]?)

Remove the \* from \*args.

Paolo
