[前][次][番号順一覧][スレッド一覧]

ruby-changes:34902

From: zzak <ko1@a...>
Date: Mon, 28 Jul 2014 06:36:01 +0900 (JST)
Subject: [ruby-changes:34902] zzak:r46985 (trunk): * vm_eval.c: [DOC] [Bug #9551] Improve clarity of Kernel::catch

zzak	2014-07-28 06:35:47 +0900 (Mon, 28 Jul 2014)

  New Revision: 46985

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=46985

  Log:
    * vm_eval.c: [DOC] [Bug #9551] Improve clarity of Kernel::catch
      documentation, patch by Jesse Sielaff.

  Modified files:
    trunk/ChangeLog
    trunk/vm_eval.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 46984)
+++ ChangeLog	(revision 46985)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Mon Jul 28 06:34:43 2014  Zachary Scott  <e@z...>
+
+	* vm_eval.c: [DOC] [Bug #9551] Improve clarity of Kernel::catch
+	  documentation, patch by Jesse Sielaff.
+
 Mon Jul 28 06:24:54 2014  Zachary Scott  <e@z...>
 
 	* lib/uri/common.rb: [DOC] [Bug #9563] Recommend using URI.escape
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 46984)
+++ vm_eval.c	(revision 46985)
@@ -1780,39 +1780,56 @@ catch_i(VALUE tag, VALUE data) https://github.com/ruby/ruby/blob/trunk/vm_eval.c#L1780
 
 /*
  *  call-seq:
- *     catch([arg]) {|tag| block }  -> obj
+ *     catch([tag]) {|tag| block }  -> obj
  *
- *  +catch+ executes its block. If a +throw+ is
- *  executed, Ruby searches up its stack for a +catch+ block
- *  with a tag corresponding to the +throw+'s
- *  _tag_. If found, that block is terminated, and
- *  +catch+ returns the value given to +throw+. If
- *  +throw+ is not called, the block terminates normally, and
- *  the value of +catch+ is the value of the last expression
- *  evaluated. +catch+ expressions may be nested, and the
- *  +throw+ call need not be in lexical scope.
- *
- *     def routine(n)
- *       puts n
- *       throw :done if n <= 0
- *       routine(n-1)
- *     end
+ *  +catch+ executes its block. If +throw+ is not called,
+ *  the block executes normally, and +catch+ returns the
+ *  value of the last expression evaluated.
+ *
+ *     catch(1) { 123 }            # => 123
+ *
+ *  If +throw(tag2, val)+ is called, Ruby searches up its
+ *  stack for a +catch+ block whose _tag_ has the same
+ *  +object_id+ as _tag2_. If found, the block stops
+ *  executing and returns _val_ (or +nil+ if no second
+ *  argument was given to +throw+).
+ *
+ *     catch(1) { throw(1, 456) }  # => 456
+ *     catch(1) { throw(1) }       # => nil
+ *
+ *  When _tag_ is passed as the first argument, +catch+
+ *  yields it as the parameter of the block.
  *
+ *     catch(1) {|x| x + 2 }       # => 3
  *
- *     catch(:done) { routine(3) }
+ *  When no _tag_ is given, +catch+ yields a new unique
+ *  object (as from +Object.new+) as the block parameter.
+ *  This object can then be used as the argument to
+ *  +throw+, and will match the correct +catch+ block.
  *
- *  <em>produces:</em>
+ *     catch do |obj_A|
+ *       catch do |obj_B|
+ *         throw(obj_B, 123)
+ *         puts "This puts is not reached"
+ *       end
  *
- *     3
- *     2
- *     1
- *     0
- *
- *  when _arg_ is given, +catch+ yields it as is, or when no
- *  _arg_ is given, +catch+ assigns a new unique object to
- *  +throw+.  this is useful for nested +catch+.  _arg_ can
- *  be an arbitrary object, not only Symbol.
+ *       puts "This puts is displayed"
+ *       456
+ *     end
+ *
+ *     # => 456
+ *
+ *     catch do |obj_A|
+ *       catch do |obj_B|
+ *         throw(obj_A, 123)
+ *         puts "This puts is still not reached"
+ *       end
+ *
+ *       puts "Now this puts is also not reached"
+ *       456
+ *     end
  *
+ *     # => 123
  */
 
 static VALUE

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]