# Default argument of Array#permutation

e\$B1sF#\$H?=\$7\$^\$9!#e(B

Array#permutation e\$B\$O%G%U%)%k%H\$GA4MWAG\$N=gNse(B (e\$B\$D\$^\$jCV49e(B)
e\$B\$r7W;;\$9\$k\$He(B
e\$B\$\$\$\$\$H;W\$\$\$^\$9!#\$I\$&\$G\$7\$g\$&\$+!#e(B

a = [1,2,3]
a.permutation.to_a
#=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

# Index: array.c

— array.c (revision 13961)
+++ array.c (working copy)
@@ -3001,11 +3001,14 @@

/*

• call-seq:
• ``````ary.permutation { |p| block }          -> array
``````
• ``````ary.permutation                        -> enumerator
``````
• ``````ary.permutation(n) { |p| block }       -> array
``````
• ``````ary.permutation(n)                     -> enumerator
``````
• When invoked with a block, yield all permutations of length n
• of the elements of ary, then return the array itself.
• If n is not specified, yield all permutations of all
elements.
• The implementation makes no guarantees about the order in which
• the permutations are yielded.

@@ -3013,6 +3016,7 @@
*

• Examples:
• ``````a = [1, 2, 3]
``````
• ``````a.permutation.to_a     #=>
``````

[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

• ``````a.permutation(1).to_a  #=> [[1],[2],[3]]
``````
• ``````a.permutation(2).to_a  #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
``````
• ``````a.permutation(3).to_a  #=>
``````

[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
@@ -3021,13 +3025,15 @@
*/

static VALUE
-rb_ary_permutation(VALUE ary, VALUE num)
+rb_ary_permutation(int argc, VALUE *argv, VALUE ary)
{

• VALUE num;
long r, n, i;
• RETURN_ENUMERATOR(ary, 1, &num); /* Return enumerator if no block
*/
• r = NUM2LONG(num); /* Permutation size from argument
*/
• n = RARRAY_LEN(ary); /* Array length */
• RETURN_ENUMERATOR(ary, argc, argv); /* Return enumerator if no
block */

• n = RARRAY_LEN(ary); /* Array length */

• rb_scan_args(argc, argv, “01”, &num);

• r = NIL_P(num) ? n : NUM2LONG(num); /* Permutation size from
argument */

if (r < 0 || n < r) {
/* no permutations: yield nothing */
@@ -3310,7 +3316,7 @@
rb_define_method(rb_cArray, “shuffle”, rb_ary_shuffle, 0);
rb_define_method(rb_cArray, “choice”, rb_ary_choice, 0);
rb_define_method(rb_cArray, “cycle”, rb_ary_cycle, 0);

• rb_define_method(rb_cArray, “permutation”, rb_ary_permutation, 1);
• rb_define_method(rb_cArray, “permutation”, rb_ary_permutation, -1);
rb_define_method(rb_cArray, “combination”, rb_ary_combination, 1);
rb_define_method(rb_cArray, “product”, rb_ary_product, -1);

e\$B\$^\$D\$b\$He(B e\$B\$f\$-\$R\$m\$G\$9e(B

In message “Re: [ruby-dev:32309] default argument of Array#permutation”
on Mon, 19 Nov 2007 12:50:30 +0900, “Yusuke ENDOH” [email protected]
writes:
|
|e\$B1sF#\$H?=\$7\$^\$9!#e(B
|
|Array#permutation e\$B\$O%G%U%)%k%H\$GA4MWAG\$N=gNse(B (e\$B\$D\$^\$jCV49e(B) e\$B\$r7W;;\$9\$k\$He(B
|e\$B\$\$\$\$\$H;W\$\$\$^\$9!#\$I\$&\$G\$7\$g\$&\$+!#e(B
|
| a = [1,2,3]
| a.permutation.to_a
| #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

e\$B\$U\$`!"\$\$\$\$\$s\$8\$c\$J\$\$\$G\$7\$g\$&\$+!#e(B