Project

General

Profile

Actions

Feature #3447

closed

argument delegation

Added by nobu (Nobuyoshi Nakada) about 15 years ago. Updated almost 4 years ago.

Status:
Closed
Target version:
-
[ruby-dev:41623]

Description

ใชใ‹ใ ใงใ™ใ€‚

http://www.rubyist.net/~matz/20100615.html#p01 ใ‚’ๅฎŸ่ฃ…ใ—ใฆใฟใพใ—ใŸใ€‚
foo(...)ใงใƒ–ใƒญใƒƒใ‚ฏใพใงใ‚ณใƒŸใ€foo(..)ใฏใƒ–ใƒญใƒƒใ‚ฏๆŠœใใซใ—ใฆใ‚ใ‚Šใพใ™ใ€‚

diff --git i/compile.c w/compile.c
index 4621cd9..d769c56 100644
--- i/compile.c
+++ w/compile.c
@@ -2729,7 +2729,6 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
 	return 1;
 
       case NODE_SUPER:
-      case NODE_ZSUPER:
 	ADD_INSN(ret, nd_line(node), putnil);
 	ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_ZSUPER), 0,
 		  needstr);
@@ -2919,6 +2918,67 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
 	    POP_ELEMENT(args);
 	    break;
 	  }
+	  case NODE_DELEGATE: {
+	    int i;
+	    rb_iseq_t *liseq = iseq->local_iseq;
+
+	    if (argn->nd_state) *flag |= VM_CALL_SUPER_BIT;
+	    argc = INT2FIX(liseq->argc);
+
+	    /* normal arguments */
+	    for (i = 0; i < liseq->argc; i++) {
+		int idx = liseq->local_size - i;
+		ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+	    }
+
+	    if (!liseq->arg_simple) {
+		if (liseq->arg_opts) {
+		    /* optional arguments */
+		    int j;
+		    for (j = 0; j < liseq->arg_opts - 1; j++) {
+			int idx = liseq->local_size - (i + j);
+			ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+		    }
+		    i += j;
+		    argc = INT2FIX(i);
+		}
+
+		if (liseq->arg_rest != -1) {
+		    /* rest argument */
+		    int idx = liseq->local_size - liseq->arg_rest;
+		    ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+		    argc = INT2FIX(liseq->arg_rest + 1);
+		    *flag |= VM_CALL_ARGS_SPLAT_BIT;
+		}
+
+		if (liseq->arg_post_len) {
+		    /* post arguments */
+		    int post_len = liseq->arg_post_len;
+		    int post_start = liseq->arg_post_start;
+
+		    if (liseq->arg_rest != -1) {
+			int j;
+			for (j=0; j<post_len; j++) {
+			    int idx = liseq->local_size - (post_start + j);
+			    ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+			}
+			ADD_INSN1(args, nd_line(argn), newarray, INT2FIX(j));
+			ADD_INSN (args, nd_line(argn), concatarray);
+			/* argc is setteled at above */
+		    }
+		    else {
+			int j;
+			for (j=0; j<post_len; j++) {
+			    int idx = liseq->local_size - (post_start + j);
+			    ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+			}
+			argc = INT2FIX(post_len + post_start);
+		    }
+		}
+	    }
+
+            break;
+          }
 	  default: {
 	    rb_bug("setup_arg: unknown node: %s\n", ruby_node_name(nd_type(argn)));
 	  }
@@ -4115,8 +4175,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
 	}
 	break;
       }
-      case NODE_SUPER:
-      case NODE_ZSUPER:{
+      case NODE_SUPER: {
 	DECL_ANCHOR(args);
 	VALUE argc;
 	unsigned long flag = 0;
@@ -4124,72 +4183,12 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
 
 	INIT_ANCHOR(args);
 	iseq->compile_data->current_block = Qfalse;
-	if (nd_type(node) == NODE_SUPER) {
-	    argc = setup_args(iseq, args, node->nd_args, &flag);
-	}
-	else {
-	    /* NODE_ZSUPER */
-	    int i;
-	    rb_iseq_t *liseq = iseq->local_iseq;
-
-	    argc = INT2FIX(liseq->argc);
-
-	    /* normal arguments */
-	    for (i = 0; i < liseq->argc; i++) {
-		int idx = liseq->local_size - i;
-		ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
-	    }
-
-	    if (!liseq->arg_simple) {
-		if (liseq->arg_opts) {
-		    /* optional arguments */
-		    int j;
-		    for (j = 0; j < liseq->arg_opts - 1; j++) {
-			int idx = liseq->local_size - (i + j);
-			ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
-		    }
-		    i += j;
-		    argc = INT2FIX(i);
-		}
-
-		if (liseq->arg_rest != -1) {
-		    /* rest argument */
-		    int idx = liseq->local_size - liseq->arg_rest;
-		    ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
-		    argc = INT2FIX(liseq->arg_rest + 1);
-		    flag |= VM_CALL_ARGS_SPLAT_BIT;
-		}
-
-		if (liseq->arg_post_len) {
-		    /* post arguments */
-		    int post_len = liseq->arg_post_len;
-		    int post_start = liseq->arg_post_start;
-
-		    if (liseq->arg_rest != -1) {
-			int j;
-			for (j=0; j<post_len; j++) {
-			    int idx = liseq->local_size - (post_start + j);
-			    ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
-			}
-			ADD_INSN1(args, nd_line(node), newarray, INT2FIX(j));
-			ADD_INSN (args, nd_line(node), concatarray);
-			/* argc is setteled at above */
-		    }
-		    else {
-			int j;
-			for (j=0; j<post_len; j++) {
-			    int idx = liseq->local_size - (post_start + j);
-			    ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
-			}
-			argc = INT2FIX(post_len + post_start);
-		    }
-		}
-	    }
-	}
+	argc = setup_args(iseq, args, node->nd_args, &flag);
 
 	/* dummy receiver */
 	ADD_INSN1(ret, nd_line(node), putobject,
-		  nd_type(node) == NODE_ZSUPER ? Qfalse : Qtrue);
+		  (flag & VM_CALL_SUPER_BIT) ? Qfalse : Qtrue);
+	flag &= ~VM_CALL_SUPER_BIT;
 	ADD_SEQ(ret, args);
 	ADD_INSN3(ret, nd_line(node), invokesuper,
 		  argc, parent_block, LONG2FIX(flag));
diff --git i/gc.c w/gc.c
index 58e4550..0d5fbad 100644
--- i/gc.c
+++ w/gc.c
@@ -1671,7 +1671,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 	    goto again;
 
 	  case NODE_ZARRAY:	/* - */
-	  case NODE_ZSUPER:
+	  case NODE_DELEGATE:
 	  case NODE_VCALL:
 	  case NODE_GVAR:
 	  case NODE_LVAR:
diff --git i/insns.def w/insns.def
index f75007d..6c1efdc 100644
--- i/insns.def
+++ w/insns.def
@@ -993,10 +993,10 @@ send
 {
     const rb_method_entry_t *me;
     VALUE recv, klass;
-    rb_block_t *blockptr = 0;
+    rb_block_t *blockptr = (op_flag & VM_CALL_SUPER_BIT) ? GET_BLOCK_PTR() : 0;
     int num = caller_setup_args(th, GET_CFP(), op_flag, (int)op_argc,
 				(rb_iseq_t *)blockiseq, &blockptr);
-    rb_num_t flag = op_flag;
+    rb_num_t flag = op_flag & ~VM_CALL_SUPER_BIT;
     ID id = op_id;
 
     /* get receiver */
diff --git i/node.c w/node.c
index 65bc541..f2900d3 100644
--- i/node.c
+++ w/node.c
@@ -408,10 +408,17 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
 	F_NODE(nd_args, "arguments");
 	break;
 
-      case NODE_ZSUPER:
-	ANN("super invocation with no argument");
-	ANN("format: super");
-	ANN("example: super");
+      case NODE_DELEGATE:
+        if (node->nd_state) {
+	    ANN("argument delegation with block");
+	    ANN("format: ...");
+	    ANN("example: foo(...)");
+        }
+	else {
+	    ANN("argument delegation without block");
+	    ANN("format: ..");
+	    ANN("example: foo(..)");
+	}
 	break;
 
       case NODE_ARRAY:
diff --git i/node.h w/node.h
index f8cf7de..74320c0 100644
--- i/node.h
+++ w/node.h
@@ -96,8 +96,8 @@ enum node_type {
 #define NODE_VCALL       NODE_VCALL
     NODE_SUPER,
 #define NODE_SUPER       NODE_SUPER
-    NODE_ZSUPER,
-#define NODE_ZSUPER      NODE_ZSUPER
+    NODE_DELEGATE,
+#define NODE_DELEGATE    NODE_DELEGATE
     NODE_ARRAY,
 #define NODE_ARRAY       NODE_ARRAY
     NODE_ZARRAY,
@@ -414,7 +414,7 @@ typedef struct RNode {
 #define NEW_FCALL(m,a) NEW_NODE(NODE_FCALL,0,m,a)
 #define NEW_VCALL(m) NEW_NODE(NODE_VCALL,0,m,0)
 #define NEW_SUPER(a) NEW_NODE(NODE_SUPER,0,0,a)
-#define NEW_ZSUPER() NEW_NODE(NODE_ZSUPER,0,0,0)
+#define NEW_DELEGATE(b) NEW_NODE(NODE_DELEGATE,0,0,b)
 #define NEW_ARGS(m,o) NEW_NODE(NODE_ARGS,o,m,0)
 #define NEW_ARGS_AUX(r,b) NEW_NODE(NODE_ARGS_AUX,r,b,0)
 #define NEW_OPT_ARG(i,v) NEW_NODE(NODE_OPT_ARG,i,v,0)
diff --git i/parse.y w/parse.y
index 9fac5bd..735d1bf 100644
--- i/parse.y
+++ w/parse.y
@@ -2399,6 +2399,20 @@ opt_paren_args	: none
 
 opt_call_args	: none
 		| call_args
+		| tDOT2
+		    {
+		    /*%%%*/
+			$$ = NEW_DELEGATE(0);
+		    /*%
+		    %*/
+		    }
+		| tDOT3
+		    {
+		    /*%%%*/
+			$$ = NEW_DELEGATE(1);
+		    /*%
+		    %*/
+		    }
 		;
 
 call_args	: command
@@ -3647,7 +3661,7 @@ method_call	: operation paren_args
 		| keyword_super
 		    {
 		    /*%%%*/
-			$$ = NEW_ZSUPER();
+			$$ = NEW_SUPER(NEW_DELEGATE(1));
 		    /*%
 			$$ = dispatch0(zsuper);
 		    %*/
diff --git i/test/ruby/test_method.rb w/test/ruby/test_method.rb
index 7be70b0..a04a285 100644
--- i/test/ruby/test_method.rb
+++ w/test/ruby/test_method.rb
@@ -345,4 +345,38 @@ class TestMethod < Test::Unit::TestCase
     obj.extend(m)
     assert_equal([:m1, :a], obj.public_methods(false), bug)
   end
+
+  def test_argument_delegate
+    class << (o = Object.new)
+      def foo(*args)
+        yield(*args)
+      end
+      def foo1(*)
+        foo(...)
+      end
+      def foo2(*)
+        foo1(...)
+      end
+      def bar(*args, &block)
+        [args, block]
+      end
+      def bar1(*)
+        bar(..)
+      end
+      def bar2(*)
+        bar1(..)
+      end
+    end
+    called = nil
+    assert_equal([42], o.foo1(42) {|*x| called = x})
+    assert_equal([42], called)
+    called = nil
+    assert_equal([42], o.foo2(42) {|*x| called = x})
+    assert_equal([42], called)
+    called = :not_called
+    assert_equal([[42], nil], o.bar1(42) {|*x| called = true})
+    assert_equal(:not_called, called)
+    assert_equal([[42], nil], o.bar2(42) {|*x| called = true})
+    assert_equal(:not_called, called)
+  end
 end

--
--- ๅƒ•ใฎๅ‰ใซBugใฏใชใ„ใ€‚
--- ๅƒ•ใฎๅพŒใ‚ใซBugใฏใงใใ‚‹ใ€‚
ไธญ็”ฐ ไผธๆ‚ฆ


Related issues 1 (0 open โ€” 1 closed)

Related to Ruby - Feature #11256: anonymous block forwardingClosedmatz (Yukihiro Matsumoto)Actions
Actions #1

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41623] [Feature:trunk] argument delegation"
on Wed, 16 Jun 2010 18:57:40 +0900, Nobuyoshi Nakada writes:

http://www.rubyist.net/~matz/20100615.html#p01 ใ‚’ๅฎŸ่ฃ…ใ—ใฆใฟใพใ—ใŸใ€‚

ๆ‰‹ใŒๆ—ฉใ„ใ€‚

foo(...)ใงใƒ–ใƒญใƒƒใ‚ฏใพใงใ‚ณใƒŸใ€foo(..)ใฏใƒ–ใƒญใƒƒใ‚ฏๆŠœใใซใ—ใฆใ‚ใ‚Šใพใ™ใ€‚

foo(..)ใฏไธ่ฆใ ใจๆ€ใ„ใพใ™ใ€‚

Actions #2

Updated by mame (Yusuke Endoh) about 15 years ago

้ ่—คใงใ™ใ€‚

2010ๅนด6ๆœˆ16ๆ—ฅ18:57 Nobuyoshi Nakada :

http://www.rubyist.net/~matz/20100615.html#p01 ใ‚’ๅฎŸ่ฃ…ใ—ใฆใฟใพใ—ใŸใ€‚

argument delegation ใฏใ€

  • ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ใ ใ‘ (ๅผ•ๆ•ฐใฏๅค‰ใˆใŸใ„) ใจใใซไธไพฟ
  • ๅผ•ๆ•ฐใฎๅค‰ๆ•ฐใธใ†ใฃใ‹ใ‚Šไปฃๅ…ฅใ—ใฆใ€้–“้•ใฃใŸๅผ•ๆ•ฐใŒๆธกใ‚‹ไบ‹ไปถใŒๅคš็™บใ—ใใ†
  • define_method ใงใ‚ตใƒใƒผใƒˆใงใใฆใ„ใชใ„ (ๅฐ†ๆฅ็š„ใซใ•ใ‚Œใ‚‹ไบˆๅฎšใฏใ‚ใ‚‹๏ผŸ)

ใฎใงใ€ใ‚ใ‚“ใพใ‚Šๅฅฝใใ˜ใ‚ƒใชใ„ใงใ™ใ€‚

ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใ‚‹ใฎใŒ้ขๅ€’ใใ•ใ„ใจใ„ใ†ๅ‹•ๆฉŸใฏใจใฆใ‚‚ใ‚ˆใใ‚ใ‹ใ‚‹ใฎใงใ€

foo(a, b, c, &)

ใจๆ›ธใ„ใŸใ‚‰ใ“ใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใฎใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใ€ใจใ„ใ†ใฎใฏใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚


Yusuke Endoh

Actions #3

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41625] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 03:36:56 +0900, Yusuke ENDOH writes:

argument delegation ใฏใ€

  1. ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ใ ใ‘ (ๅผ•ๆ•ฐใฏๅค‰ใˆใŸใ„) ใจใใซไธไพฟ
  2. ๅผ•ๆ•ฐใฎๅค‰ๆ•ฐใธใ†ใฃใ‹ใ‚Šไปฃๅ…ฅใ—ใฆใ€้–“้•ใฃใŸๅผ•ๆ•ฐใŒๆธกใ‚‹ไบ‹ไปถใŒๅคš็™บใ—ใใ†
  3. define_method ใงใ‚ตใƒใƒผใƒˆใงใใฆใ„ใชใ„ (ๅฐ†ๆฅ็š„ใซใ•ใ‚Œใ‚‹ไบˆๅฎšใฏใ‚ใ‚‹๏ผŸ)

ใฎใงใ€ใ‚ใ‚“ใพใ‚Šๅฅฝใใ˜ใ‚ƒใชใ„ใงใ™ใ€‚

  1. ใซใคใ„ใฆใฏใ€ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ๆ™‚ใซใฏใ€ๆ˜Ž็คบ็š„ใซใƒ–ใƒญใƒƒ
    ใ‚ฏใ‚’ๅผ•ใๆธกใ›ใฐใ‚ˆใ„(ใฒใจใคใฎใ“ใจใ‚’ใ—ใŸใ„ใจใใซใ€ใฒใจใคใฎใ“
    ใจใ‚’ใ™ใ‚Œใฐใ‚ˆใ„ใ€‚ๅ†—้•ทๆ€งใฏใชใ„)ใฎใงใ€ๆ‰‹ๅฝ“ใฆใฎๅฟ…่ฆใŒใ‚ใ‚‹ใ‹
    ใฉใ†ใ‹็–‘ๅ•ใงใ™ใ€‚ไปŠๅ›žใฎๅ‹•ๆฉŸใฏใ€Œใฒใจใคใฎใ“ใจใ‚’ใ™ใ‚‹ใฎใซใ€ใต
    ใŸใคใฎใ“ใจใ‚’ๆ›ธใ‹ใชใ„ใจใ„ใ‘ใชใ„ใ€ใจใ„ใ†ๅ†—้•ทๆ€งใงใ™ใ‹ใ‚‰ใ€‚

  2. ใ“ใ‚Œใฏsuperใงใ‚‚ใใ†ใงใ™ใ‚ˆใญใ€‚ๆ˜”ใ€superใฏๅผ•ๆ•ฐใฎๅค‰ๆ•ฐใซไปฃๅ…ฅ
    ใ—ใฆใ‚‚ใใฎใพใพๆธกใ‚‹ไป•ๆง˜ใ ใฃใŸใฎใงใ™ใŒใ€ๅฎŸ่ฃ…ไธŠใฎๅ•้กŒใงใ‚ใ
    ใ‚‰ใ‚ใพใ—ใŸใ€‚

  3. ๅฐ†ๆฅ็š„ใซใฏใ€define_methodใงใ‚‚ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ในใใ ใจๆ€ใ„ใพ
    ใ™ใ€‚ใงใใฆใชใ„ใฎใฏๅฎŸ่ฃ…ไธŠใฎๅˆถ็ด„ใ ใจๆ€ใฃใฆใใ ใ•ใ„ใ€‚

ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใ‚‹ใฎใŒ้ขๅ€’ใใ•ใ„ใจใ„ใ†ๅ‹•ๆฉŸใฏใจใฆใ‚‚ใ‚ˆใใ‚ใ‹ใ‚‹ใฎใงใ€

foo(a, b, c, &)

ใจๆ›ธใ„ใŸใ‚‰ใ“ใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใฎใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใ€ใจใ„ใ†ใฎใฏใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚

็นฐใ‚Š่ฟ”ใ—ใซใชใ‚Šใพใ™ใŒใ€ใ“ใ‚Œใงใฏใ€Œใฒใจใคใฎใ“ใจใ‚’ใ™ใ‚‹ใฎใซใ€ใตใŸ
ใคใฎใ“ใจใ‚’ๆ›ธใ‹ใชใ„ใจใ„ใ‘ใชใ„ใ€ใจใ„ใ†ๅ†—้•ทๆ€งใŒ่งฃๆฑบใงใใฆใพใ›ใ‚“ใ€‚
ๅฎŸ่ณช่ฟฝๅŠ ใฏ2ๆ–‡ๅญ—ใ ใ‹ใ‚‰่ฒ ๆ‹…ใฏ่ปฝใใชใ‚Šใพใ™ใŒใ€‚

ใŒใ€ใ‚‚ใจใ‚‚ใจใฎๅ‹•ๆฉŸใจใฏๅˆฅใจใ—ใฆใ€ใ€Œ&ใ€1ๆ–‡ๅญ—ใงใใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆ
ใฎใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใฎใฏใ€้ข็™ฝใ„ใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใ ใจๆ€ใ„ใพใ™ใ€‚ใ“ใฎๅ ดๅˆ
ใฏใ€ไปฎๅผ•ๆ•ฐใƒชใ‚นใƒˆใฎใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใŒใชใใฆใ‚‚ใ€ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใ“ใจ
ใซใชใ‚‹ใ‚“ใงใ™ใ‹ใญใ€‚

                            ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ /:|)
Actions #4

Updated by ko1 (Koichi Sasada) about 15 years ago

ใ€€ใ•ใ•ใ ใงใ™๏ผŽ

(2010/06/17 6:31), Yukihiro Matsumoto wrote::

argument delegation ใฏใ€

  1. ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ใ ใ‘ (ๅผ•ๆ•ฐใฏๅค‰ใˆใŸใ„) ใจใใซไธไพฟ
  2. ๅผ•ๆ•ฐใฎๅค‰ๆ•ฐใธใ†ใฃใ‹ใ‚Šไปฃๅ…ฅใ—ใฆใ€้–“้•ใฃใŸๅผ•ๆ•ฐใŒๆธกใ‚‹ไบ‹ไปถใŒๅคš็™บใ—ใใ†
  3. define_method ใงใ‚ตใƒใƒผใƒˆใงใใฆใ„ใชใ„ (ๅฐ†ๆฅ็š„ใซใ•ใ‚Œใ‚‹ไบˆๅฎšใฏใ‚ใ‚‹๏ผŸ)

ใฎใงใ€ใ‚ใ‚“ใพใ‚Šๅฅฝใใ˜ใ‚ƒใชใ„ใงใ™ใ€‚

  1. ใซใคใ„ใฆใฏใ€ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ๆ™‚ใซใฏใ€ๆ˜Ž็คบ็š„ใซใƒ–ใƒญใƒƒ
    ใ‚ฏใ‚’ๅผ•ใๆธกใ›ใฐใ‚ˆใ„(ใฒใจใคใฎใ“ใจใ‚’ใ—ใŸใ„ใจใใซใ€ใฒใจใคใฎใ“
    ใจใ‚’ใ™ใ‚Œใฐใ‚ˆใ„ใ€‚ๅ†—้•ทๆ€งใฏใชใ„)ใฎใงใ€ๆ‰‹ๅฝ“ใฆใฎๅฟ…่ฆใŒใ‚ใ‚‹ใ‹
    ใฉใ†ใ‹็–‘ๅ•ใงใ™ใ€‚ไปŠๅ›žใฎๅ‹•ๆฉŸใฏใ€Œใฒใจใคใฎใ“ใจใ‚’ใ™ใ‚‹ใฎใซใ€ใต
    ใŸใคใฎใ“ใจใ‚’ๆ›ธใ‹ใชใ„ใจใ„ใ‘ใชใ„ใ€ใจใ„ใ†ๅ†—้•ทๆ€งใงใ™ใ‹ใ‚‰ใ€‚

  2. ใ“ใ‚Œใฏsuperใงใ‚‚ใใ†ใงใ™ใ‚ˆใญใ€‚ๆ˜”ใ€superใฏๅผ•ๆ•ฐใฎๅค‰ๆ•ฐใซไปฃๅ…ฅ
    ใ—ใฆใ‚‚ใใฎใพใพๆธกใ‚‹ไป•ๆง˜ใ ใฃใŸใฎใงใ™ใŒใ€ๅฎŸ่ฃ…ไธŠใฎๅ•้กŒใงใ‚ใ
    ใ‚‰ใ‚ใพใ—ใŸใ€‚

  3. ๅฐ†ๆฅ็š„ใซใฏใ€define_methodใงใ‚‚ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ในใใ ใจๆ€ใ„ใพ
    ใ™ใ€‚ใงใใฆใชใ„ใฎใฏๅฎŸ่ฃ…ไธŠใฎๅˆถ็ด„ใ ใจๆ€ใฃใฆใใ ใ•ใ„ใ€‚

ใ€€ใ€ŒๅฎŸ่ฃ…ไธŠใฎๅˆถ็ด„ใ€ใฏใใฎใจใŠใ‚Šใง๏ผŒ่จ€่ชžใƒ‡ใ‚ถใ‚คใƒณใจใ—ใฆใ‚ใ‚‹ในใใงใฏใชใ„ใจๆ€
ใ„ใพใ™๏ผŽ

๏ผˆๅฎŸ่ฃ…ใŒ็ฐกๅ˜ใ‹ใฉใ†ใ‹ใฏๅˆฅใฎ่ฉฑใงใ™ใ‘ใฉ๏ผ‰

ใ€€ใใ‚Œใฏ็ฝฎใ„ใจใ„ใฆ๏ผŒใ“ใ‚Œ๏ผŒใใ‚“ใชใซไฝฟใ†ใ‚“ใงใ—ใ‚‡ใ†ใ‹๏ผŽใ‚ใพใ‚Šไฝฟใ‚ใชใ„ๆฉŸ่ƒฝ
ใซ๏ผŒๆ–ฐใ—ใ„่จ˜ๅทใ‚’ๅ…ฅใ‚Œใ‚‹ใฎใฏๆŠตๆŠ—ใŒใ‚ใ‚Šใพใ™๏ผŽใจใใซ๏ผŒfoo(...) ใจใ‹๏ผŒๆ“ฌไผผ
ใ‚ณใƒผใƒ‰ใงใ‚ˆใไฝฟใ†ใฎใง๏ผŒๆŠตๆŠ—ใŒใ‚ใ‚Šใพใ™๏ผŽๆ–‡่„ˆใงใ‚ใ‹ใ‚‹ใฃใกใ‚ƒใ‚ใ‹ใ‚‹ใ‚“ใงใ™ใŒ๏ผŽ

ๅˆฉ็”จไพ‹๏ผš
http://rurema.clear-code.com/query:%28...%29/

ใ€€้ ่—คใ•ใ‚“ใฎ

ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใ‚‹ใฎใŒ้ขๅ€’ใใ•ใ„ใจใ„ใ†ๅ‹•ๆฉŸใฏใจใฆใ‚‚ใ‚ˆใใ‚ใ‹ใ‚‹ใฎใงใ€

  foo(a, b, c, &)

ใจๆ›ธใ„ใŸใ‚‰ใ“ใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใฎใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใ€ใจใ„ใ†ใฎใฏใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใฎ่ฉฑใฏ๏ผŒใ‚ใ‚๏ผŒใ‚ใฃใŸใ‚‰ไฝฟใ†ใ‹ใ‚‚๏ผŒใจๆ€ใ„ใพใ—ใŸ๏ผŽ


// SASADA Koichi at atdot dot net

Actions #5

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41629] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 10:45:11 +0900, SASADA Koichi writes:
https://bugs.ruby-lang.org/issues/3447#

ใ€€ใใ‚Œใฏ็ฝฎใ„ใจใ„ใฆ๏ผŒใ“ใ‚Œ๏ผŒใใ‚“ใชใซไฝฟใ†ใ‚“ใงใ—ใ‚‡ใ†ใ‹๏ผŽใ‚ใพใ‚Šไฝฟใ‚ใชใ„ๆฉŸ่ƒฝ
ใซ๏ผŒๆ–ฐใ—ใ„่จ˜ๅทใ‚’ๅ…ฅใ‚Œใ‚‹ใฎใฏๆŠตๆŠ—ใŒใ‚ใ‚Šใพใ™๏ผŽใจใใซ๏ผŒfoo(...) ใจใ‹๏ผŒๆ“ฌไผผ
ใ‚ณใƒผใƒ‰ใงใ‚ˆใไฝฟใ†ใฎใง๏ผŒๆŠตๆŠ—ใŒใ‚ใ‚Šใพใ™๏ผŽๆ–‡่„ˆใงใ‚ใ‹ใ‚‹ใฃใกใ‚ƒใ‚ใ‹ใ‚‹ใ‚“ใงใ™ใŒ๏ผŽ

ๅˆฉ็”จไพ‹๏ผš
http://rurema.clear-code.com/query:%28...%29/

ใใ‚“ใชใซ้ ป็นใซไฝฟใ†ใ‹ใจ่จ€ใ†ใจใ€ใใ“ใพใงใงใฏใชใ„ใจๆ€ใ„ใพใ™ใ€‚ใŒใ€
ๅ…จ็„ถใชใ„ใ‚ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ—ใ€็นฐใ‚Š่ฟ”ใ—ใซใชใ‚Šใพใ™ใŒใ€ใ€Œใ‚„ใ‚ŠใŸ
ใ„ใ“ใจใซๅฏพใ™ใ‚‹ๅ†—้•ทๆ€งใ€ใ‹ใ‚‰่€ƒใˆใ‚‹ใจๆ‰‹ๅฝ“ใฆใ‚’ใ—ใŸๆ–นใŒใ‚ˆใ„ใจๆ€ใ„
ใพใ™ใ€‚

ใ—ใ‹ใ—ใ€ใ€Œ...ใ€ใซใใ“ใพใงใ“ใ ใ‚ใฃใฆใ„ใ‚‹ใ‚ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใฎใงใ€
ไป–ใฎๆ–‡ๆณ•ใงใ‚‚ๆง‹ใ„ใพใ›ใ‚“ใ€‚ใŸใ ใ—ใ€Rใ‚„LuaใงใฏๅŒใ˜็›ฎ็š„ใซใ€Œ...ใ€ใŒ
ไฝฟใ‚ใ‚Œใฆใ„ใพใ™ใ‹ใ‚‰ใ€ใใ‚“ใชใซๆ‚ชใ„ๆกˆใงใ‚‚ใชใ„ใ ใ‚ใ†ใจๆ€ใฃใฆใพใ™ใ€‚

Actions #6

Updated by akr (Akira Tanaka) about 15 years ago

2010ๅนด6ๆœˆ17ๆ—ฅ6:31 Yukihiro Matsumoto :

  1. ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ใ ใ‘ (ๅผ•ๆ•ฐใฏๅค‰ใˆใŸใ„) ใจใใซไธไพฟ
  1. ใซใคใ„ใฆใฏใ€ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ๆ™‚ใซใฏใ€ๆ˜Ž็คบ็š„ใซใƒ–ใƒญใƒƒ
    ใ‚ฏใ‚’ๅผ•ใๆธกใ›ใฐใ‚ˆใ„(ใฒใจใคใฎใ“ใจใ‚’ใ—ใŸใ„ใจใใซใ€ใฒใจใคใฎใ“
    ใจใ‚’ใ™ใ‚Œใฐใ‚ˆใ„ใ€‚ๅ†—้•ทๆ€งใฏใชใ„)ใฎใงใ€ๆ‰‹ๅฝ“ใฆใฎๅฟ…่ฆใŒใ‚ใ‚‹ใ‹
    ใฉใ†ใ‹็–‘ๅ•ใงใ™ใ€‚ไปŠๅ›žใฎๅ‹•ๆฉŸใฏใ€Œใฒใจใคใฎใ“ใจใ‚’ใ™ใ‚‹ใฎใซใ€ใต
    ใŸใคใฎใ“ใจใ‚’ๆ›ธใ‹ใชใ„ใจใ„ใ‘ใชใ„ใ€ใจใ„ใ†ๅ†—้•ทๆ€งใงใ™ใ‹ใ‚‰ใ€‚

ไปŠๅ›žใฎ่ฉฑใซใฏใชใœใ‹่งฆใ‚Œใ‚‰ใ‚Œใฆใ„ใชใ„ใ‚“ใงใ™ใŒใ€
ใ“ใฎๆฉŸ่ƒฝใฎ่ƒŒๆ™ฏใฎใฒใจใคใซใฏใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใŒใ‚ใ‚‹ใ‚ˆใ†ใซๆ€ใˆใพใ™ใ€‚

ใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใ‚’ๅŠ ใˆใŸใจใใซใ€ใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใŒ
ๆ™ฎ้€šใฎๅผ•ๆ•ฐใงใ‚‚ใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใงใ‚‚ใชใ„ใ‚‚ใฎใจใ™ใ‚‹ใจใ€
ใ™ในใฆใฎๅผ•ๆ•ฐใ‚’ๅผ•ใๆธกใ™ใฎใซ 3ใคใใ‚Œใžใ‚Œใซใคใ„ใฆๅผ•ใๆธกใ•ใชใ„ใจใ„ใ‘ใพใ›ใ‚“ใ€‚

ใใ‚Œใ‚’้ฟใ‘ใ‚‹ใŸใ‚ใซใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใ‚’ๆ™ฎ้€šใฎๅผ•ๆ•ฐใฎไธ€้ƒจใซใ™ใ‚‹ใจใ„ใ†ใ“ใจใซใ—ใŸใ‚‰ใ€
ๅ่ซ–ใŒๅ‡บใพใใฃใฆไป•ๆง˜ใŒใพใจใพใ‚‰ใชใ‹ใฃใŸใ€ใจใ„ใ†ใฎใŒ็งใฎ่ช่ญ˜ใงใ™ใ€‚
ruby-talk:162431

ใใ‚Œใชใ‚‰ใ™ในใฆใฎๅผ•ๆ•ฐใ‚’ๅผ•ใๆธกใ™ใŸใ‚ใฎๆฉŸ่ƒฝใ‚’ใคใ‘ใ‚‹ใ€ใจใ„ใ†ใ‚ขใ‚คใƒ‡ใ‚ขใ‚’
ruby-talk:162561 ใ‚„ ruby-dev:30892 ใซๆ›ธใ„ใŸใ“ใจใŒใ‚ใ‚Šใพใ™ใŒใ€
ใใฎๆ™‚็‚นใงใฏๅๅฟœใ‚’ๅพ—ใ‚‰ใ‚Œใพใ›ใ‚“ใงใ—ใŸใ€‚

ใใ†ใ„ใ†ๆตใ‚ŒใงไปŠๅ›žใฎใ‚’่ฆ‹ใ‚‹ใจใ€ใ‚ใ‚Šๅพ—ใ‚‹ๆ–นๅ‘ใ ใจๆ€ใ†ใ‚ใ‘ใงใ™ใŒใ€
2ใคๆ‡ธๅฟตใŒใ‚ใ‚Šใพใ™ใ€‚

ไปŠใฏๆ™ฎ้€šใฎๅผ•ๆ•ฐใจใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใฎใตใŸใคใ—ใ‹ใชใ„ใฎใงใ€
ใฒใจใคใ‚’ๅค‰ใˆใ‚‹ใชใ‚‰ใ€ๆฎ‹ใ‚Šใฏใฒใจใคใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“ใ€‚
ใ—ใŸใŒใฃใฆใ€ๆฎ‹ใ‚Šใ™ในใฆใ‚’ๅผ•ใๆธกใ™ใฎใฏใฒใจใคๆ›ธใ‘ใฐๆธˆใฟใพใ™ใ€‚

ใ—ใ‹ใ—ใ€ใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใŒๅ…ฅใ‚‹ใจใฟใฃใคใซใชใ‚‹ใฎใงใ€
ใฒใจใคใ‚’ๅค‰ใˆใ‚‹ใชใ‚‰ใ€ๆฎ‹ใ‚ŠใฏใตใŸใคใซใชใ‚Šใพใ™ใ€‚
ๆฎ‹ใ‚Šใ™ในใฆใ‚’ๅผ•ใๆธกใ™ใฎใซใตใŸใคๆ›ธใๅฟ…่ฆใŒๅ‡บใฆใใพใ™ใ€‚
ใŠใใ‚‰ใใ“ใ‚Œใฏใ†ใ‚Œใ—ใใชใ„ใงใ—ใ‚‡ใ†ใ€‚

ใคใพใ‚Šใ€argument delegation ใฏใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใ‚’ๅ…ฅใ‚Œใ‚‹ใจใใซๅ›ฐใ‚‹ๅ•้กŒใ‚’่งฃๆฑบใ™ใ‚‹
ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใจๆ€ใฃใŸใ‚‰ใ€ๅฎŸ้š›ใฎใจใ“ใ‚ใฏใ‚ใพใ‚Š่งฃๆฑบใ—ใฆใ„ใชใ„ใ€ใจใ„ใ†ใ‚ใ‘ใงใ™ใ€‚

  1. define_method ใงใ‚ตใƒใƒผใƒˆใงใใฆใ„ใชใ„ (ๅฐ†ๆฅ็š„ใซใ•ใ‚Œใ‚‹ไบˆๅฎšใฏใ‚ใ‚‹๏ผŸ)
  1. ๅฐ†ๆฅ็š„ใซใฏใ€define_methodใงใ‚‚ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ในใใ ใจๆ€ใ„ใพ
    ใ™ใ€‚ใงใใฆใชใ„ใฎใฏๅฎŸ่ฃ…ไธŠใฎๅˆถ็ด„ใ ใจๆ€ใฃใฆใใ ใ•ใ„ใ€‚

ใ‚‚ใ†ใฒใจใคใฏ define_method ใ‚„ lambda ใจใฎ้–ข้€ฃใงใ™ใ€‚

... ใจใ„ใ†ๆง‹ๆ–‡ใซใฏๅๅ‰ใŒๅ…ฅใฃใฆใ„ใชใ„ใฎใงใ€

def f(a)
  lambda {|b|
    g(...)
  }
end

ใจใ—ใŸใจใใซ ... ใฏใฉใฎๅผ•ๆ•ฐใ‚’ๆŒ‡ใ™ใฎใ‹ไธๆ˜Žใงใ™ใ€‚

ไป•ๆง˜ใจใ—ใฆใฉใกใ‚‰ใ‹ใซๅ›บๅฎšใ™ใ‚‹ใ“ใจใฏใงใใ‚‹ใงใ—ใ‚‡ใ†ใŒใ€
ใƒ—ใƒญใ‚ฐใƒฉใƒžใŒ้ธในใ‚‹ใ‚ˆใ†ใชๆง‹ๆ–‡ใซใฏใชใฃใฆใ„ใพใ›ใ‚“ใ€‚

ใใฎใ†ใกใ€้ธในใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ๆง‹ๆ–‡ใŒ่ฆๆฑ‚ใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚‹ใ‚“ใ˜ใ‚ƒใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚


[็”ฐไธญ ๅ“ฒ][ใŸใชใ‹ ใ‚ใใ‚‰][Tanaka Akira]

Actions #7

Updated by shugo (Shugo Maeda) about 15 years ago

ๅ‰็”ฐใงใ™ใ€‚

argument delegationใซใคใ„ใฆใฏใพใ ๆ…‹ๅบฆใ‚’ๆฑบใ‚ใ‹ใญใฆใ„ใ‚‹ใฎใงใ™ใŒใ€
super(...)ใŒๅฐŽๅ…ฅใ•ใ‚ŒใŸใ‚‰ใ€(่ญฆๅ‘Šใ‚’ๅ‡บใ™ใชใฉใฎ็งป่กŒใ‚นใƒ†ใƒƒใƒ—ใ‚’็ตŒใฆ)
ๆ‹ฌๅผงใชใ—superใฏsuper()ใจๅŒใ˜ๆ„ๅ‘ณใซใ—ใฆใ—ใพใฃใฆใฏใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚

2010ๅนด6ๆœˆ17ๆ—ฅ6:31 Yukihiro Matsumoto :

  1. ใ“ใ‚Œใฏsuperใงใ‚‚ใใ†ใงใ™ใ‚ˆใญใ€‚ๆ˜”ใ€superใฏๅผ•ๆ•ฐใฎๅค‰ๆ•ฐใซไปฃๅ…ฅ
    ใ—ใฆใ‚‚ใใฎใพใพๆธกใ‚‹ไป•ๆง˜ใ ใฃใŸใฎใงใ™ใŒใ€ๅฎŸ่ฃ…ไธŠใฎๅ•้กŒใงใ‚ใ
    ใ‚‰ใ‚ใพใ—ใŸใ€‚

superใงใฏใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใธใฎไปฃๅ…ฅใŒๅๆ˜ ใ•ใ‚Œใชใ„ๅ‹•ไฝœใซใชใฃใฆใ„ใพใ™ใŒใ€
argument delegationใงใฏใฉใ†ใชใ‚Šใพใ™ใ‹?

def foo(&b)
  b = lambda { puts "lambda in foo" }
  bar(...)
end

ใจใ„ใ†ใ‚ฑใƒผใ‚นใฎ่ฉฑใงใ™ใŒใ€‚


Shugo Maeda

Actions #8

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41634] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 13:58:53 +0900, Shugo Maeda writes:

argument delegationใซใคใ„ใฆใฏใพใ ๆ…‹ๅบฆใ‚’ๆฑบใ‚ใ‹ใญใฆใ„ใ‚‹ใฎใงใ™ใŒใ€
super(...)ใŒๅฐŽๅ…ฅใ•ใ‚ŒใŸใ‚‰ใ€(่ญฆๅ‘Šใ‚’ๅ‡บใ™ใชใฉใฎ็งป่กŒใ‚นใƒ†ใƒƒใƒ—ใ‚’็ตŒใฆ)
ๆ‹ฌๅผงใชใ—superใฏsuper()ใจๅŒใ˜ๆ„ๅ‘ณใซใ—ใฆใ—ใพใฃใฆใฏใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใ†ใƒผใ‚“ใ€superใŒsuper()ใฎๆ„ๅ‘ณใงใ‚ใฃใฆใ†ใ‚Œใ—ใ„ใฎใฏใ€

  • ใƒซใƒผใƒซใŒๅฐ‘ใชใใชใ‚‹
  • ็„กๅผ•ๆ•ฐsuperใฎๅ‘ผใณๅ‡บใ—ใŒๅๅˆ†ใซๅคšใ„

ใฎใ„ใšใ‚Œใ‹ใ ใจๆ€ใ†ใฎใงใ™ใŒใ€ๅ‰่€…ใฏ็ตๅฑ€ใฏRubyใฎ่จญ่จˆใงใฏๅ„ชๅ…ˆๅบฆ
ใŒไฝŽใ„ใ€Œไธ€่ฒซๆ€งใ€ใ‚’้ซ˜ใ‚ใ‚‹ใจใ„ใ†ใ“ใจใชใฎใงใ€ใ“ใฎ้š›ใ€Œใ†ใ‚Œใ—ใ„ใ€
ใจใฏ่ฉ•ไพกใ—ใพใ›ใ‚“ใ€‚

ๅพŒ่€…ใงใ™ใŒใ€ใ“ใ‚ŒใŒๅฎŸ้š›็š„ใซใ†ใ‚Œใ—ใ„ใฎใฏ

  • superใ‚’ๅซใ‚€ใƒกใ‚ฝใƒƒใƒ‰ใŒๅผ•ๆ•ฐใ‚’๏ผ‘ๅ€‹ไปฅไธŠๅ—ใ‘ๅ–ใ‚Š
  • superใซใฏใฒใจใคใ‚‚ๆธกใ•ใชใ„

ใจใ„ใ†ใ‚ฑใƒผใ‚นใ ใ‘ใงใ€superใฎไฝฟใ„้“ใฎใ†ใกๅคšใใ‚’ๅซใ‚€(ใจๆ€ใ‚ใ‚Œใ‚‹)

  • superใ‚’ๅซใ‚€ใƒกใ‚ฝใƒƒใƒ‰ใŒๅผ•ๆ•ฐใ‚’๏ผ‘ๅ€‹ไปฅไธŠๅ—ใ‘ๅ–ใ‚Š
  • superใซใใฎใพใพๆธกใ™

ๅ ดๅˆใ€ใ“ใ‚Œใพใงsuperใ ใ‘ใงใ™ใ‚“ใ ใ‚‚ใฎใ‚’super(...)ใจๆ›ธใ‹ใญใฐใชใ‚‰
ใšใ€ใกใฃใจใ‚‚ใ†ใ‚Œใ—ใใ‚ใ‚Šใพใ›ใ‚“ใ€‚

  • superใ‚’ๅซใ‚€ใƒกใ‚ฝใƒƒใƒ‰ใŒๅผ•ๆ•ฐใ‚’๏ผ‘ๅ€‹ไปฅไธŠๅ—ใ‘ๅ–ใ‚Š
  • superใซใฏๅˆฅใฎๅผ•ๆ•ฐใ‚’ๆธกใ™

ๅ ดๅˆใ€argment delegationใฏๅฝนใซ็ซ‹ใŸใชใ„ใฎใฏไบ‹ๅฎŸใงใ™ใŒใ€ใใ‚Œใฏ
superใ‚’super()ใซใ™ใ‚‹ใ“ใจใจใฏ็„ก้–ขไฟ‚ใงใ—ใ‚‡ใ†ใ€‚

superใงใฏใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใธใฎไปฃๅ…ฅใŒๅๆ˜ ใ•ใ‚Œใชใ„ๅ‹•ไฝœใซใชใฃใฆใ„ใพใ™ใŒใ€
argument delegationใงใฏใฉใ†ใชใ‚Šใพใ™ใ‹?

def foo(&b)
  b = lambda { puts "lambda in foo" }
  bar(...)
end

ใจใ„ใ†ใ‚ฑใƒผใ‚นใฎ่ฉฑใงใ™ใŒใ€‚

ใ€ŒsuperใจๅŒใ˜ๅ‹•ไฝœใ€ใจใ„ใ†ใฎใŒๅŸบๆœฌใ ใจๆ€ใ„ใพใ™ใ€‚ๆœฌๅฝ“ใฏใ€้€šๅธธ
ๅผ•ๆ•ฐใ‚‚ไปฃๅ…ฅใŒๅๆ˜ ใ•ใ‚Œใชใ„ใ‚ˆใ†ใซใ—ใŸใ„ใฎใงใ™ใŒใ€YARVใฎๅฎŸ่ฃ…ใ ใจ
้›ฃใ—ใ„ใจ่žใ„ใŸใ‚ˆใ†ใชๆฐ—ใŒใ—ใพใ™ใ€‚

                            ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ /:|)
Actions #9

Updated by ko1 (Koichi Sasada) about 15 years ago

(2010/06/17 14:53), Yukihiro Matsumoto wrote::

ใ€ŒsuperใจๅŒใ˜ๅ‹•ไฝœใ€ใจใ„ใ†ใฎใŒๅŸบๆœฌใ ใจๆ€ใ„ใพใ™ใ€‚ๆœฌๅฝ“ใฏใ€้€šๅธธ
ๅผ•ๆ•ฐใ‚‚ไปฃๅ…ฅใŒๅๆ˜ ใ•ใ‚Œใชใ„ใ‚ˆใ†ใซใ—ใŸใ„ใฎใงใ™ใŒใ€YARVใฎๅฎŸ่ฃ…ใ ใจ
้›ฃใ—ใ„ใจ่žใ„ใŸใ‚ˆใ†ใชๆฐ—ใŒใ—ใพใ™ใ€‚

ใ€€ๅฎŸ่ฃ…ใ˜ใ‚ƒใชใใฆใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚’็†็”ฑใซใŠ้ก˜ใ„ใ—ใพใ—ใŸ๏ผŽๅผ•ๆ•ฐ้ ˜ๅŸŸใฎใ‚ณใƒ”ใƒผ
ใ‚’๏ผŒใ‚นใ‚ฟใƒƒใ‚ฏใƒ•ใƒฌใƒผใƒ ็ฉใ‚€ใ”ใจใซ่กŒใ†ใฎใฏๅซŒใงใ™๏ผˆๅซŒใชใฎใฏไฟบใ ใ‘ใ‹ใ‚‚๏ผ‰๏ผŽ

zsuper ใŒใ‚ใฃใŸใจใใ ใ‘๏ผŒใจใ„ใ†ใฎใ‚‚ eval ใŒใ‚ใ‚‹ใ‹ใ‚‰็ตๅฑ€ใƒ€ใƒก๏ผŽยถ

ใ€€ๆ„ๅ‘ณ็š„ใซใ‚‚๏ผŒๅ€‹ไบบ็š„ใซใฏ 1.9 ใฎไป•ๆง˜ใŒๅฅฝใใชใฎใงใ™ใŒ๏ผŽ


// SASADA Koichi at atdot dot net

Actions #10

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41631] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 12:05:22 +0900, Tanaka Akira writes:

ใใ†ใ„ใ†ๆตใ‚ŒใงไปŠๅ›žใฎใ‚’่ฆ‹ใ‚‹ใจใ€ใ‚ใ‚Šๅพ—ใ‚‹ๆ–นๅ‘ใ ใจๆ€ใ†ใ‚ใ‘ใงใ™ใŒใ€
2ใคๆ‡ธๅฟตใŒใ‚ใ‚Šใพใ™ใ€‚

ไปŠใฏๆ™ฎ้€šใฎๅผ•ๆ•ฐใจใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใฎใตใŸใคใ—ใ‹ใชใ„ใฎใงใ€
ใฒใจใคใ‚’ๅค‰ใˆใ‚‹ใชใ‚‰ใ€ๆฎ‹ใ‚Šใฏใฒใจใคใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“ใ€‚
ใ—ใŸใŒใฃใฆใ€ๆฎ‹ใ‚Šใ™ในใฆใ‚’ๅผ•ใๆธกใ™ใฎใฏใฒใจใคๆ›ธใ‘ใฐๆธˆใฟใพใ™ใ€‚

ใ—ใ‹ใ—ใ€ใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใŒๅ…ฅใ‚‹ใจใฟใฃใคใซใชใ‚‹ใฎใงใ€
ใฒใจใคใ‚’ๅค‰ใˆใ‚‹ใชใ‚‰ใ€ๆฎ‹ใ‚ŠใฏใตใŸใคใซใชใ‚Šใพใ™ใ€‚
ๆฎ‹ใ‚Šใ™ในใฆใ‚’ๅผ•ใๆธกใ™ใฎใซใตใŸใคๆ›ธใๅฟ…่ฆใŒๅ‡บใฆใใพใ™ใ€‚
ใŠใใ‚‰ใใ“ใ‚Œใฏใ†ใ‚Œใ—ใใชใ„ใงใ—ใ‚‡ใ†ใ€‚

ใ€Œใฒใจใคใ‚’ๅค‰ใˆใ‚‹ใ€ใจใ„ใ†ๆ„ๅ‘ณใŒใ„ใพใ„ใก่ชญใฟๅ–ใ‚Œใชใ‹ใฃใŸใฎใงใ™
ใŒใ€ใ“ใ‚ŒใฏใŸใจใˆใฐใ€ใ€Œ้€šๅธธใฎๅผ•ๆ•ฐใฎๅ‰ใซใฒใจใคๅˆฅใฎๅผ•ๆ•ฐใ‚’ๅŠ ใˆใ‚‹ใ€
ใจใ‹ใ€ใ€Œ้€šๅธธๅผ•ๆ•ฐใฏๅŒใ˜ใ ใŒใ€ๆธกใ™ใƒ–ใƒญใƒƒใ‚ฏใ ใ‘ๅค‰ใˆใ‚‹ใ€ใจใ‹ใใ†
ใ„ใ†ๆ„ๅ‘ณใชใ‚“ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใ ใจใ™ใ‚‹ใจใ€ใŠใฃใ—ใ‚ƒใ‚‹ใ“ใจใฏ็†่งฃใงใใพใ™ใ€‚ใŸใ ใ—ใ€ใ„ใพใฎใจใ“
ใ‚ใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใฏ้€šๅธธใฎๅผ•ๆ•ฐใฎไธ€้ƒจใจใ—ใฆๆ‰ฑใŠใ†ใจๆ€ใฃใฆใ„ใ‚‹ใฎ
ใงใ€ใ‚ใพใ‚Šๅ•้กŒใซใฏใชใ‚‰ใชใ„ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚

ใ‚‚ใ†ใฒใจใคใฏ define_method ใ‚„ lambda ใจใฎ้–ข้€ฃใงใ™ใ€‚

... ใจใ„ใ†ๆง‹ๆ–‡ใซใฏๅๅ‰ใŒๅ…ฅใฃใฆใ„ใชใ„ใฎใงใ€

def f(a)
  lambda {|b|
    g(...)
  }
end

ใจใ—ใŸใจใใซ ... ใฏใฉใฎๅผ•ๆ•ฐใ‚’ๆŒ‡ใ™ใฎใ‹ไธๆ˜Žใงใ™ใ€‚

็ขบใ‹ใซใ€‚ใŸใ ใ—ใ€ใ€Œไธ€็•ชๅ†…ๅดใฎๅผ•ๆ•ฐใ€ใจใ‹ใ€Œlambdaใฏ็„ก่ฆ–ใ€ใƒกใ‚ฝใƒƒ
ใƒ‰ใฎๅผ•ๆ•ฐใ€ใงใ‚‚ใฉใกใ‚‰ใงใ‚‚ใ‚ใพใ‚Šๅ•้กŒใชใ„ใ‚ˆใ†ใชๆฐ—ใ‚‚ใ—ใพใ™ใ€‚ใจใ„
ใ†ใฎใ‚‚ใ€ใ“ใฎ่จ˜ๆณ•ใฏใ€ใงใใชใ„ใ“ใจใ‚’ใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใ‚‚ใฎใงใฏใช
ใใฆใ€ใ‚ใ‚“ใฉใใ•ใ„ใ‚‚ใฎใ‚’ใ‚ˆใ‚Šๆฅฝใซ่กจ็พใ—ใ‚ˆใ†ใจใ„ใ†ใ‚‚ใฎใงใ™ใ‹ใ‚‰ใ€
ไป•ๆง˜ใฎ่ค‡้›‘ๅŒ–ใ‚’้ฟใ‘ใฆใ‚ใ‚‹็จ‹ๅบฆใงใ€Œใ‚ใใ‚‰ใ‚ใ‚‹ใ€ใจใ„ใ†ใฎใฏๅๅˆ†ใ‚
ใ‚Šใˆใ‚‹ๅˆคๆ–ญใ ใจๆ€ใ„ใพใ™ใ€‚

ไป•ๆง˜ใจใ—ใฆใฉใกใ‚‰ใ‹ใซๅ›บๅฎšใ™ใ‚‹ใ“ใจใฏใงใใ‚‹ใงใ—ใ‚‡ใ†ใŒใ€
ใƒ—ใƒญใ‚ฐใƒฉใƒžใŒ้ธในใ‚‹ใ‚ˆใ†ใชๆง‹ๆ–‡ใซใฏใชใฃใฆใ„ใพใ›ใ‚“ใ€‚

ใใฎใ†ใกใ€้ธในใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ๆง‹ๆ–‡ใŒ่ฆๆฑ‚ใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚‹ใ‚“ใ˜ใ‚ƒใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใใฎใ‚ˆใ†ใชไป•ๆง˜ใฎใฒใจใคใฎๆกˆใจใ—ใฆใฏใ€ใ€Œ...ใ€ใใฎใ‚‚ใฎใ‚’ๅผใจใ—ใฆ
ใ—ใพใฃใฆใ€ใใฎๅ€คใ‚’ruby-talk:162561 ใง็คบใ•ใ‚ŒใŸใ‚ˆใ†ใชใ‚ชใƒ–ใ‚ธใ‚ง
ใ‚ฏใƒˆใซใ™ใ‚‹ๆ–นๆณ•ใŒใ‚ใ‚Šใพใ™ใญใ€‚ใใฎๅ ดๅˆใซใฏใ€Œ**ใ€ใจใ€Œ**objใ€ใฎๆ–น
ใŒ่‰ฏใ„ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€‚

ใคใพใ‚Šใ€

def f(a)
  c = **
  lambda {|b|
    g(**c)    # aใ‚’ๆธกใ™
  }
end

def f(a)
  lambda {|b|
    g(**)    # bใ‚’ๆธกใ™
  }
end

ใจใ„ใ†ใ“ใจใงใ™ใญใ€‚ใŸใ ใ€over specใชๅฐ่ฑกใŒใ‚ใ‚Šใพใ™ใ€‚

                            ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ /:|)
Actions #11

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41636] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 15:03:33 +0900, SASADA Koichi writes:

ใ€€ๅฎŸ่ฃ…ใ˜ใ‚ƒใชใใฆใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚’็†็”ฑใซใŠ้ก˜ใ„ใ—ใพใ—ใŸ๏ผŽๅผ•ๆ•ฐ้ ˜ๅŸŸใฎใ‚ณใƒ”ใƒผ
ใ‚’๏ผŒใ‚นใ‚ฟใƒƒใ‚ฏใƒ•ใƒฌใƒผใƒ ็ฉใ‚€ใ”ใจใซ่กŒใ†ใฎใฏๅซŒใงใ™๏ผˆๅซŒใชใฎใฏไฟบใ ใ‘ใ‹ใ‚‚๏ผ‰๏ผŽ

ใใ†ใ„ใˆใฐใใ†ใ ใฃใŸใ‚ˆใ†ใชใ€‚

ใ€€ๆ„ๅ‘ณ็š„ใซใ‚‚๏ผŒๅ€‹ไบบ็š„ใซใฏ 1.9 ใฎไป•ๆง˜ใŒๅฅฝใใชใฎใงใ™ใŒ๏ผŽ

็‰นใซไปŠใฎใงใฏใƒ€ใƒกใจๆ€ใฃใฆใ‚‹ใ‚ใ‘ใงใฏใชใ„ใฎใงใ™ใŒ(ๅผ•ๆ•ฐใ‚’ๆ›ธใๆ›
ใˆใ‚‹ใ‚„ใคใŒๆ‚ชใ„)ใ€ใŸใ ใ—ใ€ใ•ใ•ใ ใใ‚“ใŒใฉใ†ใ—ใฆใ€Œ1.9 ใฎไป•ๆง˜ใŒ
ๅฅฝใใ€ใชใฎใ‹ใ€ใใฎ็†็”ฑใซใฏ้–ขๅฟƒใŒใ‚ใ‚Šใพใ™ใ€‚

                            ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ /:|)
Actions #12

Updated by ko1 (Koichi Sasada) about 15 years ago

ใ€€ใ•ใ•ใ ใงใ™๏ผŽ

(2010/06/17 15:17), Yukihiro Matsumoto wrote::

ใ€€ๆ„ๅ‘ณ็š„ใซใ‚‚๏ผŒๅ€‹ไบบ็š„ใซใฏ 1.9 ใฎไป•ๆง˜ใŒๅฅฝใใชใฎใงใ™ใŒ๏ผŽ

็‰นใซไปŠใฎใงใฏใƒ€ใƒกใจๆ€ใฃใฆใ‚‹ใ‚ใ‘ใงใฏใชใ„ใฎใงใ™ใŒ(ๅผ•ๆ•ฐใ‚’ๆ›ธใๆ›
ใˆใ‚‹ใ‚„ใคใŒๆ‚ชใ„)ใ€ใŸใ ใ—ใ€ใ•ใ•ใ ใใ‚“ใŒใฉใ†ใ—ใฆใ€Œ1.9 ใฎไป•ๆง˜ใŒ
ๅฅฝใใ€ใชใฎใ‹ใ€ใใฎ็†็”ฑใซใฏ้–ขๅฟƒใŒใ‚ใ‚Šใพใ™ใ€‚

ใ€€ๆ›ธใๆ›ใˆใ‚‹่‡ช็”ฑใŒใ‚ใ‚‹ใฎใง๏ผŒใใฃใกใฎใปใ†ใŒใ„ใ„ใ‹ใชใ๏ผŒใจ๏ผŽ


// SASADA Koichi at atdot dot net

Actions #13

Updated by shugo (Shugo Maeda) about 15 years ago

ๅ‰็”ฐใงใ™ใ€‚

2010ๅนด6ๆœˆ17ๆ—ฅ14:53 Yukihiro Matsumoto :

argument delegationใซใคใ„ใฆใฏใพใ ๆ…‹ๅบฆใ‚’ๆฑบใ‚ใ‹ใญใฆใ„ใ‚‹ใฎใงใ™ใŒใ€
super(...)ใŒๅฐŽๅ…ฅใ•ใ‚ŒใŸใ‚‰ใ€(่ญฆๅ‘Šใ‚’ๅ‡บใ™ใชใฉใฎ็งป่กŒใ‚นใƒ†ใƒƒใƒ—ใ‚’็ตŒใฆ)
ๆ‹ฌๅผงใชใ—superใฏsuper()ใจๅŒใ˜ๆ„ๅ‘ณใซใ—ใฆใ—ใพใฃใฆใฏใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใ†ใƒผใ‚“ใ€superใŒsuper()ใฎๆ„ๅ‘ณใงใ‚ใฃใฆใ†ใ‚Œใ—ใ„ใฎใฏใ€

  • ใƒซใƒผใƒซใŒๅฐ‘ใชใใชใ‚‹
  • ็„กๅผ•ๆ•ฐsuperใฎๅ‘ผใณๅ‡บใ—ใŒๅๅˆ†ใซๅคšใ„

ใฎใ„ใšใ‚Œใ‹ใ ใจๆ€ใ†ใฎใงใ™ใŒใ€ๅ‰่€…ใฏ็ตๅฑ€ใฏRubyใฎ่จญ่จˆใงใฏๅ„ชๅ…ˆๅบฆ
ใŒไฝŽใ„ใ€Œไธ€่ฒซๆ€งใ€ใ‚’้ซ˜ใ‚ใ‚‹ใจใ„ใ†ใ“ใจใชใฎใงใ€ใ“ใฎ้š›ใ€Œใ†ใ‚Œใ—ใ„ใ€
ใจใฏ่ฉ•ไพกใ—ใพใ›ใ‚“ใ€‚

ๅผทใ„ใฆใ„ใˆใฐๅ‰่€…ใงใ™ใŒใ€ใƒซใƒผใƒซใŒๅฐ‘ใชใใชใ‚‹ใ“ใจใใฎใ‚‚ใฎใŒใ†ใ‚Œใ—ใ„
ใฎใงใฏใชใใฆใ€้€šๅธธใฎใƒกใ‚ฝใƒƒใƒ‰ๅ‘ผๅ‡บใ—ใ ใจ()ใ‚’ไป˜ใ‘ใชใใฆใ‚‚ใ‚ˆใ„ใฎใซใ€
superใฎใจใใ ใ‘ๅผ•ๆ•ฐใŒใชใ„ใฎใซ()ใ‚’ไป˜ใ‘ใชใ„ใจใ„ใ‘ใชใ„ใฎใŒ(่ฆ‹ใŸ็›ฎ
็š„ใซ)ๆฐ—ๆŒใกๆ‚ชใ„ใ€ใจใ„ใ†็†็”ฑใงใ™ใ€‚

ๅพŒ่€…ใงใ™ใŒใ€ใ“ใ‚ŒใŒๅฎŸ้š›็š„ใซใ†ใ‚Œใ—ใ„ใฎใฏ

  • superใ‚’ๅซใ‚€ใƒกใ‚ฝใƒƒใƒ‰ใŒๅผ•ๆ•ฐใ‚’๏ผ‘ๅ€‹ไปฅไธŠๅ—ใ‘ๅ–ใ‚Š
  • superใซใฏใฒใจใคใ‚‚ๆธกใ•ใชใ„

ใจใ„ใ†ใ‚ฑใƒผใ‚นใ ใ‘ใงใ€

็งใฎ็ตŒ้จ“ใงใฏใ€initializeใ‚’ใ‚ชใƒผใƒใƒผใƒฉใ‚คใƒ‰ใ™ใ‚‹ใจใใซsuper()ใจๆ›ธใ‹ใชใ„ใจ
ใ„ใ‘ใชใใฆๆฐ—ๆŒใกๆ‚ชใ„ใจๆ„Ÿใ˜ใ‚‹ใ“ใจใŒ็ตๆง‹ใ‚ใ‚Šใพใ—ใŸใ€‚
ใกใชใฟใซๆจ™ๆบ–ๆทปไป˜ใƒฉใ‚คใƒ–ใƒฉใƒชใซใŠใ‘ใ‚‹super/super()ใฎๅˆฉ็”จ็ฎ‡ๆ‰€ใ‚’่ชฟในใŸใจใ“ใ‚

super: 391็ฎ‡ๆ‰€
super(): 292็ฎ‡ๆ‰€

ใจใ„ใ†็ตๆžœใงใ—ใŸใ€‚ๆ„ๅค–ใจใ„ใ„ๅ‹่ฒ ใ˜ใ‚ƒใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚

superใฎไฝฟใ„้“ใฎใ†ใกๅคšใใ‚’ๅซใ‚€(ใจๆ€ใ‚ใ‚Œใ‚‹)

  • superใ‚’ๅซใ‚€ใƒกใ‚ฝใƒƒใƒ‰ใŒๅผ•ๆ•ฐใ‚’๏ผ‘ๅ€‹ไปฅไธŠๅ—ใ‘ๅ–ใ‚Š
  • superใซใใฎใพใพๆธกใ™

ๅ ดๅˆใ€ใ“ใ‚Œใพใงsuperใ ใ‘ใงใ™ใ‚“ใ ใ‚‚ใฎใ‚’super(...)ใจๆ›ธใ‹ใญใฐใชใ‚‰
ใšใ€ใกใฃใจใ‚‚ใ†ใ‚Œใ—ใใ‚ใ‚Šใพใ›ใ‚“ใ€‚

5ๆ–‡ๅญ—ใฎ็ฏ€็ด„ใŒ้‡่ฆใซใชใ‚‹ใปใฉใ‚ˆใไฝฟใ†ๆฉŸ่ƒฝใงใ‚‚ใชใ„ใจๆ€ใ†ใฎใงใ€
็Ÿญใ„่จ˜่ฟฐใงๆธˆใ‚€ใ“ใจใ‚ˆใ‚Šใ‚‚ใ€ไป–ใฎๆฉŸ่ƒฝใจใฎ้กžๆŽจใงsuperใฎๆŒ™ๅ‹•ใ‚’
ๆŽจๆธฌใงใใ‚‹ใ“ใจใฎๆ–นใŒๅˆฉ็‚นใŒๅคงใใ„ใ‚ˆใ†ใซๆ€ใ„ใพใ™ใ€‚

ใŸใ ใ€ไบ’ๆ›ๆ€งใฎๅ•้กŒใ‚‚ใ‚ใ‚‹(ๆ—ขๅญ˜ใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใฏๆฉŸๆขฐ็š„ใซ็ฝฎๆ›ใงใใ‚‹
ใ‚“ใ˜ใ‚ƒใชใ„ใ‹ใจๆ€ใ„ใพใ™ใŒ)ใฎใงใ€ใใ‚Œใปใฉๅผทใใฏไธปๅผตใ—ใพใ›ใ‚“ใ€‚

superใงใฏใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใธใฎไปฃๅ…ฅใŒๅๆ˜ ใ•ใ‚Œใชใ„ๅ‹•ไฝœใซใชใฃใฆใ„ใพใ™ใŒใ€
argument delegationใงใฏใฉใ†ใชใ‚Šใพใ™ใ‹?

def foo(&b)
  b = lambda { puts "lambda in foo" }
  bar(...)
end

ใจใ„ใ†ใ‚ฑใƒผใ‚นใฎ่ฉฑใงใ™ใŒใ€‚

ใ€ŒsuperใจๅŒใ˜ๅ‹•ไฝœใ€ใจใ„ใ†ใฎใŒๅŸบๆœฌใ ใจๆ€ใ„ใพใ™ใ€‚ๆœฌๅฝ“ใฏใ€้€šๅธธ
ๅผ•ๆ•ฐใ‚‚ไปฃๅ…ฅใŒๅๆ˜ ใ•ใ‚Œใชใ„ใ‚ˆใ†ใซใ—ใŸใ„ใฎใงใ™ใŒใ€YARVใฎๅฎŸ่ฃ…ใ ใจ
้›ฃใ—ใ„ใจ่žใ„ใŸใ‚ˆใ†ใชๆฐ—ใŒใ—ใพใ™ใ€‚

ๆ€ง่ƒฝไธŠใฎ็†็”ฑใจใ„ใ†ใ“ใจใงไบ†่งฃใ—ใพใ—ใŸใ€‚
# ๅ€‹ไบบ็š„ใซใฏใ€ๅผ•ๆ•ฐใซไปฃๅ…ฅใ™ใ‚‹ใฎใฏๆ‚ชใ„ใ‚นใ‚ฟใ‚คใƒซใ ใจๆ€ใฃใฆใ‚‹ใฎใงใ€ใฉใฃใกใงใ‚‚
# ใ„ใ„ใ‚“ใงใ™ใ‘ใฉใ€‚


Shugo Maeda

Actions #14

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41641] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 17:05:10 +0900, Shugo Maeda writes:

็งใฎ็ตŒ้จ“ใงใฏใ€initializeใ‚’ใ‚ชใƒผใƒใƒผใƒฉใ‚คใƒ‰ใ™ใ‚‹ใจใใซsuper()ใจๆ›ธใ‹ใชใ„ใจ
ใ„ใ‘ใชใใฆๆฐ—ๆŒใกๆ‚ชใ„ใจๆ„Ÿใ˜ใ‚‹ใ“ใจใŒ็ตๆง‹ใ‚ใ‚Šใพใ—ใŸใ€‚
ใกใชใฟใซๆจ™ๆบ–ๆทปไป˜ใƒฉใ‚คใƒ–ใƒฉใƒชใซใŠใ‘ใ‚‹super/super()ใฎๅˆฉ็”จ็ฎ‡ๆ‰€ใ‚’่ชฟในใŸใจใ“ใ‚

super: 391็ฎ‡ๆ‰€
super(): 292็ฎ‡ๆ‰€

ใจใ„ใ†็ตๆžœใงใ—ใŸใ€‚ๆ„ๅค–ใจใ„ใ„ๅ‹่ฒ ใ˜ใ‚ƒใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใ†ใƒผใ‚“ใ€็งใŒ lib/**/*.rb ใงๆ•ฐใˆใŸใ‚‰ super()ใ€ใคใพใ‚Šๆ˜Ž็คบ็š„ใซ็„ก
ๅผ•ๆ•ฐใงๅ‘ผใณๅ‡บใ—ใŸsuperใฏ66็ฎ‡ๆ‰€ใ—ใ‹่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸใ€‚ใ†ใก2
็ฎ‡ๆ‰€ใฏใƒกใ‚ฝใƒƒใƒ‰ใซๅผ•ๆ•ฐใŒใชใ„ใฎใงsuperใงใ‚‚ๅŒใ˜ใ“ใจใงใ™ใ€‚้€†ใซๆš—้ป™
ใซๅผ•ๆ•ฐใ‚’ๅผ•ใๆธกใ™superใฏ243็ฎ‡ๆ‰€ใงใ™ใ€‚ๅฐ‘ใ€…ใฎๆ•ฐใˆใ‚‚ใ‚ŒใŒใ‚ใฃใฆใ‚‚
ใŠใ‹ใ—ใใชใ„ใงใ™ใŒใ€ใ‚ใพใ‚Šใซใ‚‚้•ใ†ใฎใงใ€ใ‚‚ใ—ใ‹ใ—ใฆๆ•ฐใˆๆ–นใŒ้•
ใ†๏ผŸ

5ๆ–‡ๅญ—ใฎ็ฏ€็ด„ใŒ้‡่ฆใซใชใ‚‹ใปใฉใ‚ˆใไฝฟใ†ๆฉŸ่ƒฝใงใ‚‚ใชใ„ใจๆ€ใ†ใฎใงใ€
็Ÿญใ„่จ˜่ฟฐใงๆธˆใ‚€ใ“ใจใ‚ˆใ‚Šใ‚‚ใ€ไป–ใฎๆฉŸ่ƒฝใจใฎ้กžๆŽจใงsuperใฎๆŒ™ๅ‹•ใ‚’
ๆŽจๆธฌใงใใ‚‹ใ“ใจใฎๆ–นใŒๅˆฉ็‚นใŒๅคงใใ„ใ‚ˆใ†ใซๆ€ใ„ใพใ™ใ€‚

็งใ€ใ‘ใฃใ“ใ†(ๅผ•ๆ•ฐ่ปข้€ใฎ) super ไฝฟใ†ใ‚“ใ ใ‘ใฉใชใ€‚

                            ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ /:|)
Actions #15

Updated by mame (Yusuke Endoh) about 15 years ago

้ ่—คใงใ™ใ€‚

2010ๅนด6ๆœˆ17ๆ—ฅ6:31 Yukihiro Matsumoto :

  1. ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ใ ใ‘ (ๅผ•ๆ•ฐใฏๅค‰ใˆใŸใ„) ใจใใซไธไพฟ
  1. (็•ฅ) ไปŠๅ›žใฎๅ‹•ๆฉŸใฏใ€Œใฒใจใคใฎใ“ใจใ‚’ใ™ใ‚‹ใฎใซใ€ใต
    ใŸใคใฎใ“ใจใ‚’ๆ›ธใ‹ใชใ„ใจใ„ใ‘ใชใ„ใ€ใจใ„ใ†ๅ†—้•ทๆ€งใงใ™ใ‹ใ‚‰ใ€‚

ใชใ‚‹ใปใฉใ€‚ใ€Œ้€šๅธธใฎๅผ•ๆ•ฐใจใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใ‚’ใพใจใ‚ใฆ delegate ใ—ใŸใ„ใ€
ใจๆ„Ÿใ˜ใŸใ“ใจใŒใ‚ใพใ‚Šใชใ‹ใฃใŸใฎใงใ€ๅ‹•ๆฉŸใ‚’ๅ‹˜้•ใ„ใ—ใฆใ„ใพใ—ใŸใ€‚

lib/ ใ‚’็ฒ—ใฃใฝใๆŽขใ—ใฆใฟใŸใ‚‰ใ€24 ็ฎ‡ๆ‰€ใปใฉ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ (ใƒกใƒผใƒซใฎ
ๆœ€ๅพŒใซ่ฒผใ‚Šใคใ‘ใฆใ‚ใ‚Šใพใ™) ใ€‚ใใ‚Œใชใ‚Šใซ้œ€่ฆใฏใ‚ใ‚‹ใฎใ‹ใชใ€‚

ใŒใ€ใ‚‚ใจใ‚‚ใจใฎๅ‹•ๆฉŸใจใฏๅˆฅใจใ—ใฆใ€ใ€Œ&ใ€1ๆ–‡ๅญ—ใงใใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆ
ใฎใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใฎใฏใ€้ข็™ฝใ„ใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใ ใจๆ€ใ„ใพใ™ใ€‚ใ“ใฎๅ ดๅˆ
ใฏใ€ไปฎๅผ•ๆ•ฐใƒชใ‚นใƒˆใฎใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใŒใชใใฆใ‚‚ใ€ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใ“ใจ
ใซใชใ‚‹ใ‚“ใงใ™ใ‹ใญใ€‚

้€šๅธธใฎๅผ•ๆ•ฐใฏ้–ขไฟ‚ใชใใ€ใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ไบ‹ไพ‹ใชใ‚‰ใ€ไธŠใจ
ๅŒใ˜ใ‚ˆใ†ใชๆคœ็ดขใง 183 ็ฎ‡ๆ‰€ (ไธŠใฎ 24 ็ฎ‡ๆ‰€ใ‚’ๅซใ‚€) ใ‚‚่ฆ‹ใคใ‹ใฃใŸใฎใงใ€
& ใฎ็œ็•ฅ่จ˜ๆณ•ใฏๆ˜ฏ้žๆฌฒใ—ใใชใฃใฆใใพใ—ใŸใ€‚

$ ruby check.rb
lib/drb/drb.rb
1079:    def method_missing(msg_id, *a, &b)
1083:   return obj.__send__(msg_id, *a, &b)

lib/test/unit/assertions.rb
22:      def assert_raise(*args, &b)
23:        assert_raises(*args, &b)

lib/rake.rb
743:      def create_rule(*args, &block)
744:        Rake.application.create_rule(*args, &block)

lib/rake.rb
844:def task(*args, &block)
845:  Rake::Task.define_task(*args, &block)

lib/rake.rb
862:def file(*args, &block)
863:  Rake::FileTask.define_task(*args, &block)

lib/rake.rb
868:def file_create(args, &block)
869:  Rake::FileCreationTask.define_task(args, &block)

lib/rake.rb
892:def multitask(args, &block)
893:  Rake::MultiTask.define_task(args, &block)

lib/rake.rb
918:def rule(*args, &block)
919:  Rake::Task.create_rule(*args, &block)

lib/scanf.rb
607:  def scanf(str,&b)
608:    return block_scanf(str,&b) if b

lib/scanf.rb
687:  def scanf(fstr,&b)
689:      block_scanf(fstr,&b)

lib/scanf.rb
716:  def scanf(fs,&b)
717:    STDIN.scanf(fs,&b)

lib/rubygems/user_interaction.rb
62:  def use_ui(new_ui, &block)
63:    Gem::DefaultUserInteraction.use_ui(new_ui, &block)

lib/optparse.rb
832:  def accept(*args, &blk) top.accept(*args, &blk) end
836:  def self.accept(*args, &blk) top.accept(*args, &blk) end

lib/optparse.rb
1202:  def on(*opts, &block)
1203:    define(*opts, &block)

lib/optparse.rb
1216:  def on_head(*opts, &block)
1217:    define_head(*opts, &block)

lib/optparse.rb
1230:  def on_tail(*opts, &block)
1231:    define_tail(*opts, &block)

lib/optparse.rb
1425:  def visit(id, *args, &block)
1427:      el.send(id, *args, &block)

lib/csv.rb
2308:def CSV(*args, &block)
2309:  CSV.instance(*args, &block)

lib/erb.rb
334:      def percent_line(line, &block)
336:      return @scan_line.call(line, &block)

lib/erb.rb
334:      def percent_line(line, &block)
341:      @scan_line.call(line, &block)

lib/matrix.rb
1457:  def map2(v, &block) # :yield: e1, e2
1459:    els = collect2(v, &block)

lib/set.rb
613:  def initialize(*args, &block)     # :nodoc:
615:    initialize(*args, &block)

lib/delegate.rb
141:  def method_missing(m, *args, &block)
144:      target.respond_to?(m) ? target.__send__(m, *args, &block) :
super(m, *args, &block)

lib/open-uri.rb
27:  def open(name, *rest, &block) # :doc:
35:      open_uri_original_open(name, *rest, &block)

count: 24
$ cat check.rb
count = 0
Dir.glob("lib/**/*.rb").each do |path|
  next unless File.file?(path)
  open(path) do |file|
    while line = file.gets
      if line =~ /^(\s*)def\s+[\d\w]+(\(.*,.*&.*\))/ # ไธกๆ–นๅผ•ใ็ถ™ใŒใ›ใ‚‹ไบ‹ไพ‹
      #if line =~ /^(\s*)def\s+[\d\w]+\(.*(&.*\))/   # ใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใ‚’ๅผ•ใ็ถ™ใŒใ›ใ‚‹ไบ‹ไพ‹
        sig = line
        lineno = file.lineno
        re1 = /^\s{#{ $1.size }}end/
        re2 = Regexp.new(Regexp.quote($2))
        while line = file.gets
          break if re1 =~ line
          if re2 =~ line
            puts path
            puts "#{ lineno }:#{ sig }"
            puts "#{ file.lineno }:#{ line }"
            puts
            count += 1
          end
        end
      end
    end
  end
end
puts "count: #{ count }"

Yusuke Endoh

Actions #16

Updated by matz (Yukihiro Matsumoto) about 15 years ago

ใพใคใ‚‚ใจ ใ‚†ใใฒใ‚ใงใ™

In message "Re: [ruby-dev:41644] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 22:29:19 +0900, Yusuke ENDOH writes:

้€šๅธธใฎๅผ•ๆ•ฐใฏ้–ขไฟ‚ใชใใ€ใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใ‚’ๅผ•ใ็ถ™ใŒใ›ใŸใ„ไบ‹ไพ‹ใชใ‚‰ใ€ไธŠใจ
ๅŒใ˜ใ‚ˆใ†ใชๆคœ็ดขใง 183 ็ฎ‡ๆ‰€ (ไธŠใฎ 24 ็ฎ‡ๆ‰€ใ‚’ๅซใ‚€) ใ‚‚่ฆ‹ใคใ‹ใฃใŸใฎใงใ€
& ใฎ็œ็•ฅ่จ˜ๆณ•ใฏๆ˜ฏ้žๆฌฒใ—ใใชใฃใฆใใพใ—ใŸใ€‚

ใ“ใ‚Œใฏ่‰ฏใ„ใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใ ใจๆ€ใ„ใพใ™ใ€‚ใ‚‚ใ—ใ‹ใ™ใ‚‹ใจๅ…ƒใฎใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ข
ใ‚ˆใ‚Šใ‚‚ใ€‚

Actions #17

Updated by shugo (Shugo Maeda) about 15 years ago

ๅ‰็”ฐใงใ™ใ€‚

2010ๅนด6ๆœˆ17ๆ—ฅ19:06 Yukihiro Matsumoto :

็งใฎ็ตŒ้จ“ใงใฏใ€initializeใ‚’ใ‚ชใƒผใƒใƒผใƒฉใ‚คใƒ‰ใ™ใ‚‹ใจใใซsuper()ใจๆ›ธใ‹ใชใ„ใจ
ใ„ใ‘ใชใใฆๆฐ—ๆŒใกๆ‚ชใ„ใจๆ„Ÿใ˜ใ‚‹ใ“ใจใŒ็ตๆง‹ใ‚ใ‚Šใพใ—ใŸใ€‚
ใกใชใฟใซๆจ™ๆบ–ๆทปไป˜ใƒฉใ‚คใƒ–ใƒฉใƒชใซใŠใ‘ใ‚‹super/super()ใฎๅˆฉ็”จ็ฎ‡ๆ‰€ใ‚’่ชฟในใŸใจใ“ใ‚

super: 391็ฎ‡ๆ‰€
super(): 292็ฎ‡ๆ‰€

ใจใ„ใ†็ตๆžœใงใ—ใŸใ€‚ๆ„ๅค–ใจใ„ใ„ๅ‹่ฒ ใ˜ใ‚ƒใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใ†ใƒผใ‚“ใ€็งใŒ lib/**/*.rb ใงๆ•ฐใˆใŸใ‚‰ super()ใ€ใคใพใ‚Šๆ˜Ž็คบ็š„ใซ็„ก
ๅผ•ๆ•ฐใงๅ‘ผใณๅ‡บใ—ใŸsuperใฏ66็ฎ‡ๆ‰€ใ—ใ‹่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸใ€‚ใ†ใก2
็ฎ‡ๆ‰€ใฏใƒกใ‚ฝใƒƒใƒ‰ใซๅผ•ๆ•ฐใŒใชใ„ใฎใงsuperใงใ‚‚ๅŒใ˜ใ“ใจใงใ™ใ€‚้€†ใซๆš—้ป™
ใซๅผ•ๆ•ฐใ‚’ๅผ•ใๆธกใ™superใฏ243็ฎ‡ๆ‰€ใงใ™ใ€‚ๅฐ‘ใ€…ใฎๆ•ฐใˆใ‚‚ใ‚ŒใŒใ‚ใฃใฆใ‚‚
ใŠใ‹ใ—ใใชใ„ใงใ™ใŒใ€ใ‚ใพใ‚Šใซใ‚‚้•ใ†ใฎใงใ€ใ‚‚ใ—ใ‹ใ—ใฆๆ•ฐใˆๆ–นใŒ้•
ใ†๏ผŸ

~/src/ruby/**/*.rbใงใ‚„ใฃใฆใพใ—ใŸใ€‚
ใงใ€ๅคšใ„ใฎใฏTkใฟใŸใ„ใงใ—ใŸโ€ฆใ€‚

5ๆ–‡ๅญ—ใฎ็ฏ€็ด„ใŒ้‡่ฆใซใชใ‚‹ใปใฉใ‚ˆใไฝฟใ†ๆฉŸ่ƒฝใงใ‚‚ใชใ„ใจๆ€ใ†ใฎใงใ€
็Ÿญใ„่จ˜่ฟฐใงๆธˆใ‚€ใ“ใจใ‚ˆใ‚Šใ‚‚ใ€ไป–ใฎๆฉŸ่ƒฝใจใฎ้กžๆŽจใงsuperใฎๆŒ™ๅ‹•ใ‚’
ๆŽจๆธฌใงใใ‚‹ใ“ใจใฎๆ–นใŒๅˆฉ็‚นใŒๅคงใใ„ใ‚ˆใ†ใซๆ€ใ„ใพใ™ใ€‚

็งใ€ใ‘ใฃใ“ใ†(ๅผ•ๆ•ฐ่ปข้€ใฎ) super ไฝฟใ†ใ‚“ใ ใ‘ใฉใชใ€‚

ใพใ‚ใ€่‡ชๅˆ†ใ‚‚็ตๆง‹ไฝฟใฃใฆใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€ใ†ใ‚Œใ—ใ‹ใฃใŸใ“ใจใฏ
ใ™ใใซๅฟ˜ใ‚Œใฆใ€ไธๆบ€ใซๆ€ใฃใŸใ“ใจใ ใ‘่ฆšใˆใฆใ„ใ‚‹ใจใ„ใ†ใ“ใจใ‹ใ‚‚
ใ—ใ‚Œใพใ›ใ‚“ใ€‚


Shugo Maeda

Actions #18

Updated by mame (Yusuke Endoh) about 15 years ago

้ ่—คใงใ™ใ€‚

2010ๅนด6ๆœˆ17ๆ—ฅ6:31 Yukihiro Matsumoto :

ใŒใ€ใ‚‚ใจใ‚‚ใจใฎๅ‹•ๆฉŸใจใฏๅˆฅใจใ—ใฆใ€ใ€Œ&ใ€1ๆ–‡ๅญ—ใงใใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆ
ใฎใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใฎใฏใ€้ข็™ฝใ„ใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใ ใจๆ€ใ„ใพใ™ใ€‚ใ“ใฎๅ ดๅˆ
ใฏใ€ไปฎๅผ•ๆ•ฐใƒชใ‚นใƒˆใฎใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใŒใชใใฆใ‚‚ใ€ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใ“ใจ
ใซใชใ‚‹ใ‚“ใงใ™ใ‹ใญใ€‚

ใƒ‘ใƒƒใƒใ‚’ๆ›ธใ„ใฆใฟใพใ—ใŸใ€‚ๆ€ใฃใŸใ‚ˆใ‚Šๅฐใ•ใๆ›ธใ‘ใพใ—ใŸใ€‚

def foo
  yield
end

def bar
  foo(&)
end

bar { p 1 }  #=> 1

ใ‚ซใƒƒใ‚ณใ‚’็œ็•ฅใ—ใŸๅ ดๅˆใ€

foo &
bar

ใจใ„ใ†ใฎใŒ foo & bar ใชใฎใ‹ foo(&); bar ใชใฎใ‹ๆ›–ๆ˜งใจใ„ใ†ๅ•้กŒใŒ
ใ‚ใ‚Šใพใ—ใŸใ€‚ใŒใ€ไบ’ๆ›ๆ€ง้‡่ฆ–ใง foo & bar ใจ่งฃ้‡ˆใ™ใ‚‹ใ‚ˆใ†ใซใชใฃใฆใ„
ใพใ™ใ€‚ใจใ„ใ†ใ‹ๆ›ธใ„ใฆใฟใŸใ‚‰ใใ†ใชใฃใŸใ€‚conflict ใฏๅ‡บใพใ›ใ‚“ใ€‚

diff --git a/compile.c b/compile.c
index 2fd804c..3f8c331 100644
--- a/compile.c
+++ b/compile.c
@@ -2863,8 +2863,13 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args,
NODE *argn, unsigned long *flag)
     INIT_ANCHOR(arg_block);
     INIT_ANCHOR(args_splat);
     if (argn && nd_type(argn) == NODE_BLOCK_PASS) {
-	COMPILE(arg_block, "block", argn->nd_body);
-	*flag |= VM_CALL_ARGS_BLOCKARG_BIT;
+	if ((VALUE)argn->nd_body != (VALUE)-1) {
+	    COMPILE(arg_block, "block", argn->nd_body);
+	    *flag |= VM_CALL_ARGS_BLOCKARG_BIT;
+	}
+	else {
+	    *flag |= VM_CALL_ARGS_BLOCKTRGH_BIT;
+	}
 	argn = argn->nd_head;
     }

diff --git a/node.c b/node.c
index 65bc541..85574b4 100644
--- a/node.c
+++ b/node.c
@@ -621,7 +621,12 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
 	ANN("example: foo(x, &blk)");
 	F_NODE(nd_head, "other arguments");
 	LAST_NODE;
-	F_NODE(nd_body, "block argument");
+	if ((VALUE)node->nd_body != (VALUE)-1) {
+	    F_NODE(nd_body, "block argument");
+	}
+	else {
+	    F_MSG(nd_body, "block argument", "-1 (anonymous)");
+	}
 	break;

       case NODE_DEFN:
diff --git a/parse.y b/parse.y
index e085088..b0b946b 100644
--- a/parse.y
+++ b/parse.y
@@ -2459,6 +2459,14 @@ block_arg	: tAMPER arg_value
 			$$ = $2;
 		    %*/
 		    }
+		| tAMPER
+		    {
+		    /*%%%*/
+			$$ = NEW_BLOCK_PASS(-1);
+		    /*%
+			$$ = dispatch0(anonymous_block_arg);
+		    %*/
+		    }
 		;

 opt_block_arg	: ',' block_arg
diff --git a/vm_core.h b/vm_core.h
index 7676b2f..f0fa3a3 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -544,6 +544,7 @@ typedef struct {
 #define VM_CALL_TAILRECURSION_BIT  (0x01 << 6)
 #define VM_CALL_SUPER_BIT          (0x01 << 7)
 #define VM_CALL_OPT_SEND_BIT       (0x01 << 8)
+#define VM_CALL_ARGS_BLOCKTRGH_BIT (0x01 << 9)

 #define VM_SPECIAL_OBJECT_VMCORE       0x01
 #define VM_SPECIAL_OBJECT_CBASE        0x02
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 985a2fb..2a127d7 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -261,6 +261,10 @@ caller_setup_args(const rb_thread_t *th,
rb_control_frame_t *cfp, VALUE flag,
 		*block = blockptr;
 	    }
 	}
+	else if (flag & VM_CALL_ARGS_BLOCKTRGH_BIT) {
+	    rb_control_frame_t *reg_cfp = cfp;
+	    *block = GET_BLOCK_PTR();
+	}
 	else if (blockiseq) {
 	    blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp);
 	    blockptr->iseq = blockiseq;

Yusuke Endoh

Actions #19

Updated by ko1 (Koichi Sasada) about 15 years ago

ใ€€ใ•ใ•ใ ใงใ™๏ผŽ

ใ€€ใ‚ใพใ‚Šใซๆš‘ใใฆ็›ฎใŒ่ฆšใ‚ใพใ—ใŸ๏ผŽ

(2010/08/25 0:30), Yusuke ENDOH wrote:

--- a/vm_core.h
+++ b/vm_core.h
@@ -544,6 +544,7 @@ typedef struct {
 #define VM_CALL_TAILRECURSION_BIT  (0x01 << 6)
 #define VM_CALL_SUPER_BIT          (0x01 << 7)
 #define VM_CALL_OPT_SEND_BIT       (0x01 << 8)
+#define VM_CALL_ARGS_BLOCKTRGH_BIT (0x01 << 9)

 #define VM_SPECIAL_OBJECT_VMCORE       0x01
 #define VM_SPECIAL_OBJECT_CBASE        0x02
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 985a2fb..2a127d7 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -261,6 +261,10 @@ caller_setup_args(const rb_thread_t *th,
rb_control_frame_t *cfp, VALUE flag,
 		*block = blockptr;
 	    }
 	}
+	else if (flag & VM_CALL_ARGS_BLOCKTRGH_BIT) {
+	    rb_control_frame_t *reg_cfp = cfp;
+	    *block = GET_BLOCK_PTR();
+	}
 	else if (blockiseq) {
 	    blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp);
 	    blockptr->iseq = blockiseq;

ใ€€ใงใใ‚Œใฐ๏ผŒVM_CALL_ARGS_BLOCKTRGH_BIT ใ‚’ๅข—ใ‚„ใ™ใ‚“ใ˜ใ‚ƒใชใ
ใฆ๏ผŒVM_CALL_ARGS_BLOCKARG_BIT ใ ใ‘ใฉ๏ผŒblockiseqใ€€ใ‹ใชใ‚“ใ‹ใฎๅ€คใ‚’็‰นๆฎŠใซใ—
ใฆใŠใใจใ‹๏ผŒใใ†ใ„ใ†ๅฎŸ่ฃ…ใซใ—ใฆใ‚‚ใ‚‰ใˆใ‚‹ใจใ„ใ„ใ‚“ใ˜ใ‚ƒใชใ„ใ‹ใจๆ€ใ„ใพใ™๏ผŽ

๏ผˆๅ‘ฝไปคใ‚ชใƒšใƒฉใƒณใƒ‰ใฎใƒใƒชใ‚จใƒผใ‚ทใƒงใƒณใŒๆธ›ใฃใŸๆ–นใŒ่‰ฒใ€…ใ†ใ‚Œใ—ใ„๏ผ‰

--
// SASADA Koichi at atdot dot net

Actions #20

Updated by mame (Yusuke Endoh) about 15 years ago

้ ่—คใงใ™ใ€‚

2010ๅนด8ๆœˆ25ๆ—ฅ3:23 SASADA Koichi :

ใ€€ใงใใ‚Œใฐ๏ผŒVM_CALL_ARGS_BLOCKTRGH_BIT ใ‚’ๅข—ใ‚„ใ™ใ‚“ใ˜ใ‚ƒใชใ
ใฆ๏ผŒVM_CALL_ARGS_BLOCKARG_BIT ใ ใ‘ใฉ๏ผŒblockiseqใ€€ใ‹ใชใ‚“ใ‹ใฎๅ€คใ‚’็‰นๆฎŠใซใ—
ใฆใŠใใจใ‹๏ผŒใใ†ใ„ใ†ๅฎŸ่ฃ…ใซใ—ใฆใ‚‚ใ‚‰ใˆใ‚‹ใจใ„ใ„ใ‚“ใ˜ใ‚ƒใชใ„ใ‹ใจๆ€ใ„ใพใ™๏ผŽ

๏ผˆๅ‘ฝไปคใ‚ชใƒšใƒฉใƒณใƒ‰ใฎใƒใƒชใ‚จใƒผใ‚ทใƒงใƒณใŒๆธ›ใฃใŸๆ–นใŒ่‰ฒใ€…ใ†ใ‚Œใ—ใ„๏ผ‰

ใ‚ณใƒกใƒณใƒˆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚ใงใ‚‚ใ€่ฆ‹ใ‹ใ‘ไธŠใƒใƒชใ‚จใƒผใ‚ทใƒงใƒณใ‚’ๅข—ใ‚„ใ•ใชใ„
ใจใ“ใ‚ใงใ€VM_CALL_ARGS_BLOCKTRGH_BIT ใซ็ตๆง‹็•ฐใชใ‚‹ 2 ใคใฎๆ„ๅ‘ณใ‚’็ชใฃ่พผใ‚€
ใ“ใจใซใชใ‚‹ (ใ‚นใ‚ฟใƒƒใ‚ฏใซ Proc ใ‚’่ผ‰ใ›ใ‚‹ใƒป่ผ‰ใ›ใชใ„ใฎ้•ใ„ใŒใ‚ใ‚‹ใฎใงใ€็ดฐใ€…ๆก
ไปถๅˆคๅฎšใŒๅฟ…่ฆใซใชใ‚‹) ใฎใงใ€ๅคงใ—ใฆๅฌ‰ใ—ใใชใ„ใจๆ€ใ„ใพใ™ใ€‚ใƒกใƒณใƒ†ใƒŠใƒณใ‚นๆ€งใ‚‚
ไธ‹ใŒใ‚Šใพใ™ใฎใงใ€ๅ…ƒใฎใƒ‘ใƒƒใƒใฎๆ–นใŒใ„ใ„ใจๆ€ใ„ใพใ™ใ€‚

ไธ€ๅฟœ blockiseq ใซ -1 ใŒๅ…ฅใฃใฆใŸใ‚‰ BLOCKTRGH ๆ‰ฑใ„ใซใ™ใ‚‹ใƒ‘ใƒƒใƒใ‚‚ๆ›ธใ„ใฆใฟ
ใพใ—ใŸใŒใ€ใ‹ใชใ‚Šๆœฌ่ณช็š„ใงใชใ„ใ‚ณใƒผใƒ‰ใงใ„ใฃใฑใ„ใซใชใ‚Šใพใ—ใŸใ€‚
# ไปŠ trunk ใŒๅฃŠใ‚Œใฆใ‚‹ใ‚ˆใ†ใชใฎใงใ€test-all ใฏใงใใฆใพใ›ใ‚“ใ€‚

diff --git a/compile.c b/compile.c
index 2fd804c..1c04640 100644
--- a/compile.c
+++ b/compile.c
@@ -1411,11 +1411,18 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
 		      case TS_ISEQ:	/* iseq */
 			{
 			    VALUE v = operands[j];
-			    rb_iseq_t *block = 0;
+			    VALUE block = 0;
 			    if (v) {
-				GetISeqPtr(v, block);
+				if (v == Qundef) {
+				    block = (VALUE)-1;
+				}
+				else {
+				    rb_iseq_t *blk;
+				    GetISeqPtr(v, blk);
+				    block = (VALUE)blk;
+				}
 			    }
-			    generated_iseq[pos + 1 + j] = (VALUE)block;
+			    generated_iseq[pos + 1 + j] = block;
 			    break;
 			}
 		      case TS_VALUE:	/* VALUE */
@@ -2853,7 +2860,7 @@ add_ensure_iseq(LINK_ANCHOR *ret, rb_iseq_t *iseq, int is_return)
 }

 static VALUE
-setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
+setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, VALUE *blockiseq, unsigned long *flag)
 {
     VALUE argc = INT2FIX(0);
     int nsplat = 0;
@@ -2863,7 +2870,13 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
     INIT_ANCHOR(arg_block);
     INIT_ANCHOR(args_splat);
     if (argn && nd_type(argn) == NODE_BLOCK_PASS) {
-	COMPILE(arg_block, "block", argn->nd_body);
+	if ((VALUE)argn->nd_body != (VALUE)-1) {
+	    COMPILE(arg_block, "block", argn->nd_body);
+	}
+	else {
+	    arg_block = 0;
+	    if (blockiseq) *blockiseq = Qundef;
+	}
 	*flag |= VM_CALL_ARGS_BLOCKARG_BIT;
 	argn = argn->nd_head;
     }
@@ -2932,7 +2945,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
 	ADD_SEQ(args, args_splat);
     }

-    if (*flag & VM_CALL_ARGS_BLOCKARG_BIT) {
+    if ((*flag & VM_CALL_ARGS_BLOCKARG_BIT) && arg_block) {
 	ADD_SEQ(args, arg_block);
     }
     return argc;
@@ -3776,7 +3789,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
 	    boff = 1;
 	  default:
 	    INIT_ANCHOR(args);
-	    argc = setup_args(iseq, args, node->nd_args->nd_head, &flag);
+	    argc = setup_args(iseq, args, node->nd_args->nd_head, 0, &flag);
 	    ADD_SEQ(ret, args);
 	}
 	ADD_INSN1(ret, nd_line(node), dupn, FIXNUM_INC(argc, 1 + boff));
@@ -4083,7 +4096,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)

 	/* args */
 	if (nd_type(node) != NODE_VCALL) {
-	    argc = setup_args(iseq, args, node->nd_args, &flag);
+	    argc = setup_args(iseq, args, node->nd_args, &parent_block, &flag);
 	}
 	else {
 	    argc = INT2FIX(0);
@@ -4121,7 +4134,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
 	INIT_ANCHOR(args);
 	iseq->compile_data->current_block = Qfalse;
 	if (nd_type(node) == NODE_SUPER) {
-	    argc = setup_args(iseq, args, node->nd_args, &flag);
+	    argc = setup_args(iseq, args, node->nd_args, &parent_block, &flag);
 	}
 	else {
 	    /* NODE_ZSUPER */
@@ -4294,7 +4307,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
 	}

 	if (node->nd_head) {
-	    argc = setup_args(iseq, args, node->nd_head, &flag);
+	    argc = setup_args(iseq, args, node->nd_head, 0, &flag);
 	}
 	else {
 	    argc = INT2FIX(0);
@@ -4906,7 +4919,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)

 	INIT_ANCHOR(recv);
 	INIT_ANCHOR(args);
-	argc = setup_args(iseq, args, node->nd_args, &flag);
+	argc = setup_args(iseq, args, node->nd_args, 0, &flag);

 	if (node->nd_recv == (NODE *) 1) {
 	    flag |= VM_CALL_FCALL_BIT;
diff --git a/insns.def b/insns.def
index fcd97ae..10b99be 100644
--- a/insns.def
+++ b/insns.def
@@ -989,7 +989,7 @@ DEFINE_INSN
 send
 (ID op_id, rb_num_t op_argc, ISEQ blockiseq, rb_num_t op_flag, IC ic)
 (...)
-(VALUE val) // inc += - (int)(op_argc + ((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? 1 : 0));
+(VALUE val) // inc += - (int)(op_argc + (((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) && (VALUE)blockiseq != (VALUE)-1) ? 1 : 0));
 {
     const rb_method_entry_t *me;
     VALUE recv, klass;
@@ -1017,7 +1017,7 @@ DEFINE_INSN
 invokesuper
 (rb_num_t op_argc, ISEQ blockiseq, rb_num_t op_flag)
 (...)
-(VALUE val) // inc += - (int)(op_argc + ((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? 1 : 0));
+(VALUE val) // inc += - (int)(op_argc + (((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) && (VALUE)blockiseq != (VALUE)-1) ? 1 : 0));
 {
     rb_block_t *blockptr = !(op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? GET_BLOCK_PTR() : 0;
     int num = caller_setup_args(th, GET_CFP(), op_flag,
diff --git a/node.c b/node.c
index 65bc541..85574b4 100644
--- a/node.c
+++ b/node.c
@@ -621,7 +621,12 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
 	ANN("example: foo(x, &blk)");
 	F_NODE(nd_head, "other arguments");
 	LAST_NODE;
-	F_NODE(nd_body, "block argument");
+	if ((VALUE)node->nd_body != (VALUE)-1) {
+	    F_NODE(nd_body, "block argument");
+	}
+	else {
+	    F_MSG(nd_body, "block argument", "-1 (anonymous)");
+	}
 	break;

       case NODE_DEFN:
diff --git a/parse.y b/parse.y
index e085088..b0b946b 100644
--- a/parse.y
+++ b/parse.y
@@ -2459,6 +2459,14 @@ block_arg	: tAMPER arg_value
 			$$ = $2;
 		    %*/
 		    }
+		| tAMPER
+		    {
+		    /*%%%*/
+			$$ = NEW_BLOCK_PASS(-1);
+		    /*%
+			$$ = dispatch0(anonymous_block_arg);
+		    %*/
+		    }
 		;

 opt_block_arg	: ',' block_arg
diff --git a/tool/instruction.rb b/tool/instruction.rb
index 4fd2127..4ce219f 100755
--- a/tool/instruction.rb
+++ b/tool/instruction.rb
@@ -66,13 +66,12 @@ class RubyVM
         ret = "int inc = 0;\n"

         @opes.each_with_index{|(t, v), i|
-          if t == 'rb_num_t' && ((re = /\b#{v}\b/n) =~ @sp_inc ||
-                                 @defopes.any?{|t, val| re =~ val})
+          if ((re = /\b#{v}\b/n) =~ @sp_inc || @defopes.any?{|t, val| re =~ val})
             ret << "        int #{v} = FIX2INT(opes[#{i}]);\n"
           end
         }
         @defopes.each_with_index{|((t, var), val), i|
-          if t == 'rb_num_t' && val != '*' && /\b#{var}\b/ =~ @sp_inc
+          if val != '*' && /\b#{var}\b/ =~ @sp_inc
             ret << "        #{t} #{var} = #{val};\n"
           end
         }
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 985a2fb..f6418b7 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -240,25 +240,31 @@ caller_setup_args(const rb_thread_t *th, rb_control_frame_t *cfp, VALUE flag,

     if (block) {
 	if (flag & VM_CALL_ARGS_BLOCKARG_BIT) {
-	    rb_proc_t *po;
-	    VALUE proc;
-
-	    proc = *(--cfp->sp);
-
-	    if (proc != Qnil) {
-		if (!rb_obj_is_proc(proc)) {
-		    VALUE b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
-		    if (NIL_P(b) || !rb_obj_is_proc(b)) {
-			rb_raise(rb_eTypeError,
-				 "wrong argument type %s (expected Proc)",
-				 rb_obj_classname(proc));
+	    if ((VALUE)blockiseq != (VALUE)-1) {
+		rb_proc_t *po;
+		VALUE proc;
+
+		proc = *(--cfp->sp);
+
+		if (proc != Qnil) {
+		    if (!rb_obj_is_proc(proc)) {
+			VALUE b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
+			if (NIL_P(b) || !rb_obj_is_proc(b)) {
+			    rb_raise(rb_eTypeError,
+				    "wrong argument type %s (expected Proc)",
+				    rb_obj_classname(proc));
+			}
+			proc = b;
 		    }
-		    proc = b;
+		    GetProcPtr(proc, po);
+		    blockptr = &po->block;
+		    RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)->proc = proc;
+		    *block = blockptr;
 		}
-		GetProcPtr(proc, po);
-		blockptr = &po->block;
-		RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)->proc = proc;
-		*block = blockptr;
+	    }
+	    else {
+		rb_control_frame_t *reg_cfp = cfp;
+		*block = GET_BLOCK_PTR();
 	    }
 	}
 	else if (blockiseq) {

Yusuke Endoh

Actions #21

Updated by yugui (Yuki Sonoda) about 15 years ago

Yuguiใงใ™

2010/6/17 Yukihiro Matsumoto :

ใŒใ€ใ‚‚ใจใ‚‚ใจใฎๅ‹•ๆฉŸใจใฏๅˆฅใจใ—ใฆใ€ใ€Œ&ใ€1ๆ–‡ๅญ—ใงใใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆ
ใฎใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใฎใฏใ€้ข็™ฝใ„ใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใ ใจๆ€ใ„ใพใ™ใ€‚ใ“ใฎๅ ดๅˆ
ใฏใ€ไปฎๅผ•ๆ•ฐใƒชใ‚นใƒˆใฎใƒ–ใƒญใƒƒใ‚ฏๅผ•ๆ•ฐใŒใชใใฆใ‚‚ใ€ใƒ–ใƒญใƒƒใ‚ฏใ‚’ๆธกใ™ใ“ใจ
ใซใชใ‚‹ใ‚“ใงใ™ใ‹ใญใ€‚

ๆทฑใ„ๅ‘ผใณๅ‡บใ—้šŽๅฑคใงใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅ—ใ‘ๅ–ใ‚‹ใŸใ‚ใซใ€ไธŠไฝใฎใƒกใ‚ฝใƒƒใƒ‰ใŒๅปถใ€…ใจใƒ–ใƒญใƒƒใ‚ฏใ‚’ๅผ•ใๆธกใ—็ถšใ‘ใ‚‹ใฃใฆใ„ใ†ใ‚ฑใƒผใ‚นใฏๅฎŸ้š›ใซใƒ—ใƒญใ‚ฐใƒฉใƒ ใ—ใฆใ„ใฆใ‚ˆใๅ‡บไผšใ„ใพใ™ใ€‚ใงใ™ใ‹ใ‚‰ใ€ใ“ใฎใจใไธ‹ไฝๅ‘ผใณๅ‡บใ—ใฎๅฎŸๅผ•ๆ•ฐใซ&blockใ‚’่ถณใ—ใฆใ€ไปฎๅผ•ๆ•ฐใซใ‚‚ๅฟ˜ใ‚Œใšใซ&blockใ‚’่ถณใ—ใฆใจใ„ใ†ใฎใฏ้ขๅ€’ใงใ€ใ“ใฎใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใฏไพฟๅˆฉใใ†ใงใ™ใ€‚

ใ—ใ‹ใ—ใ€ใ‚ใพใ‚Šใซใ‚‚็Ÿญใ™ใŽใ‚‹ใ€‚&๏ผ‘ๆ–‡ๅญ—ใฏ่ฆ‹่ฝใจใ—ใใ†ใงใ™ใ€‚

foo(a, b, &yield)

ใชใ‚“ใฆใฎใฏ้ง„็›ฎใงใ—ใ‚‡ใ†ใ‹ใ€‚yield ใจ block.callใฎ้กžไผผๆ€งใ‹ใ‚‰ใฎ้กžๆŽจใงใ™ใ€‚


Yuki Sonoda (Yugui)

http://yugui.jp

Actions #22

Updated by mame (Yusuke Endoh) about 15 years ago

้ ่—คใงใ™ใ€‚

2010ๅนด8ๆœˆ26ๆ—ฅ23:28 Yugui :

ใ—ใ‹ใ—ใ€ใ‚ใพใ‚Šใซใ‚‚็Ÿญใ™ใŽใ‚‹ใ€‚&๏ผ‘ๆ–‡ๅญ—ใฏ่ฆ‹่ฝใจใ—ใใ†ใงใ™ใ€‚

ใ„ใ‚„ใ‚ใ€่€ƒใˆใ™ใŽใงใ—ใ‚‡ใ†ใ€‚
func(foo + bar, baz * qux, i) ใง i ใ‚’่ฆ‹่ฝใจใ™ใจใ‹ใชใ„ใงใ™ใ‚ˆใ€‚
& ใฏ i ใ‚ˆใ‚Š็›ฎ็ซ‹ใคใ—ใ€‚

foo(a, b, &yield)

ใชใ‚“ใฆใฎใฏ้ง„็›ฎใงใ—ใ‚‡ใ†ใ‹ใ€‚yield ใจ block.callใฎ้กžไผผๆ€งใ‹ใ‚‰ใฎ้กžๆŽจใงใ™ใ€‚

ใใ‚Œใฏไบ’ๆ›ๆ€งใซๅ•้กŒใŒใ‚ใ‚Šใพใ™ใ€‚


Yusuke Endoh

Updated by shyouhei (Shyouhei Urabe) over 13 years ago

  • Description updated (diff)
  • Status changed from Open to Feedback
  • ใ“ใฎใ‚นใƒฌใƒƒใƒ‰ใฎ็พ็Šถใ‚’ใฉใชใŸใ‹ๆ•™ใˆใฆใ„ใŸใ ใ‘ใพใ›ใ‚“ใ‹ใ€‚
  • ใ“ใฎ่จ˜ๆณ•ใฎใƒฆใƒผใ‚นใ‚ฑใƒผใ‚นใ‚’ใฉใชใŸใ‹ๆ•™ใˆใฆใ„ใŸใ ใ‘ใพใ›ใ‚“ใ‹ใ€‚

Updated by nobu (Nobuyoshi Nakada) over 13 years ago

  • Description updated (diff)

Updated by mame (Yusuke Endoh) almost 13 years ago

  • Status changed from Feedback to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)
  • Target version set to 2.6

shyouhei (Shyouhei Urabe) wrote:

  • ใ“ใฎใ‚นใƒฌใƒƒใƒ‰ใฎ็พ็Šถใ‚’ใฉใชใŸใ‹ๆ•™ใˆใฆใ„ใŸใ ใ‘ใพใ›ใ‚“ใ‹ใ€‚

matz ใฎๆœ€็ต‚็š„ใช go ahead ๅพ…ใกใ ใจๆ€ใ„ใพใ™ใŒใ€2.0.0 ใฎ feature deadline ใฏ้ŽใŽใŸใฎใง next minor ใซใ€‚

  • ใ“ใฎ่จ˜ๆณ•ใฎใƒฆใƒผใ‚นใ‚ฑใƒผใ‚นใ‚’ใฉใชใŸใ‹ๆ•™ใˆใฆใ„ใŸใ ใ‘ใพใ›ใ‚“ใ‹ใ€‚

ใ€Œใ“ใฎ่จ˜ๆณ•ใ€ใฏ matz ใฎๅ…ƒๆๆกˆใฎ่ฉฑ๏ผŸใใ‚Œใจใ‚‚ & ใฎ่ฉฑ๏ผŸ
ๅพŒ่€…ใ ใจใ—ใŸใ‚‰ใ€

def foo; ... yield ... end
foo { ... }

ใจๆ›ธใ„ใฆใŸใ‚“ใ ใ‘ใฉใ€ใƒชใƒ•ใ‚กใ‚ฏใ‚ฟใƒชใƒณใ‚ฐใง foo ใฎไธญ่บซใ‚’ bar ใซใใใ‚Šๅ‡บใ™ใ“ใจใซใชใฃใŸใ€ใจใ„ใ†ใจใใ€

def bar; ... yield ... end
def foo(&blk); ... bar(&blk) ... end
foo { ... }

ใจใ™ใ‚‹ใจๆ€ใ„ใพใ™ใŒใ€blk ใจใ„ใ†ไธ€ๆ™‚ๅค‰ๆ•ฐใ‚’ๅฎš็พฉใ—ใŸใใชใ„ and/or ใƒ–ใƒญใƒƒใ‚ฏใŒ Proc ๅŒ–ใ™ใ‚‹ใฎใง้‡ใใชใ‚‹ใฎใŒๅซŒใ€ใจใ‹ใงใ™ใ‹ใญใ€‚


Yusuke Endoh

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

  • Description updated (diff)
Actions #27

Updated by matz (Yukihiro Matsumoto) about 10 years ago

Actions #28

Updated by naruse (Yui NARUSE) over 7 years ago

  • Target version deleted (2.6)
Actions #29

Updated by jeremyevans0 (Jeremy Evans) almost 4 years ago

  • Status changed from Assigned to Closed
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0