mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Michael Granger added RDoc for range.c
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5273 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									f0346bd249
								
							
						
					
					
						commit
						bba2f6d405
					
				
					 1 changed files with 184 additions and 0 deletions
				
			
		
							
								
								
									
										184
									
								
								range.c
									
										
									
									
									
								
							
							
						
						
									
										184
									
								
								range.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -66,6 +66,15 @@ rb_range_new(beg, end, exclude_end)
 | 
			
		|||
    return range;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     Range.new(start, end, exclusive=false)    => range
 | 
			
		||||
 *  
 | 
			
		||||
 *  Constructs a range using the given <i>start</i> and <i>end</i>. If the third
 | 
			
		||||
 *  parameter is omitted or is <code>false</code>, the <i>range</i> will include
 | 
			
		||||
 *  the end object; otherwise, it will be excluded.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_initialize(argc, argv, range)
 | 
			
		||||
    int argc;
 | 
			
		||||
| 
						 | 
				
			
			@ -83,6 +92,14 @@ range_initialize(argc, argv, range)
 | 
			
		|||
    return Qnil;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng.exclude_end?    => true or false
 | 
			
		||||
 *  
 | 
			
		||||
 *  Returns <code>true</code> if <i>rng</i> excludes its end value.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_exclude_end_p(range)
 | 
			
		||||
    VALUE range;
 | 
			
		||||
| 
						 | 
				
			
			@ -90,6 +107,21 @@ range_exclude_end_p(range)
 | 
			
		|||
    return EXCL(range) ? Qtrue : Qfalse;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng == obj    => true or false
 | 
			
		||||
 *  
 | 
			
		||||
 *  Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent
 | 
			
		||||
 *  beginning and end items (by comparing them with <code>==</code>), and has
 | 
			
		||||
 *  the same #exclude_end? setting as <i>rng</t>.
 | 
			
		||||
 *     
 | 
			
		||||
 *    (0..2) == (0..2)            #=> true
 | 
			
		||||
 *    (0..2) == Range.new(0,2)    #=> true
 | 
			
		||||
 *    (0..2) == (0...2)           #=> false
 | 
			
		||||
 *     
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_eq(range, obj)
 | 
			
		||||
    VALUE range, obj;
 | 
			
		||||
| 
						 | 
				
			
			@ -131,6 +163,20 @@ r_le(a, b)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng.eql?(obj)    => true or false
 | 
			
		||||
 *  
 | 
			
		||||
 *  Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent
 | 
			
		||||
 *  beginning and end items (by comparing them with #eql?), and has the same
 | 
			
		||||
 *  #exclude_end? setting as <i>rng</i>.
 | 
			
		||||
 *     
 | 
			
		||||
 *    (0..2) == (0..2)            #=> true
 | 
			
		||||
 *    (0..2) == Range.new(0,2)    #=> true
 | 
			
		||||
 *    (0..2) == (0...2)           #=> false
 | 
			
		||||
 *     
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_eql(range, obj)
 | 
			
		||||
    VALUE range, obj;
 | 
			
		||||
| 
						 | 
				
			
			@ -206,6 +252,34 @@ range_each_func(range, func, v, e, arg)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng.step(n=1) {| obj | block }    => rng
 | 
			
		||||
 *  
 | 
			
		||||
 *  Iterates over <i>rng</i>, passing each <i>n</i>th element to the block. If
 | 
			
		||||
 *  the range contains numbers or strings, natural ordering is used.  Otherwise
 | 
			
		||||
 *  <code>step</code> invokes <code>succ</code> to iterate through range
 | 
			
		||||
 *  elements. The following code uses class <code>Xs</code>, which is defined
 | 
			
		||||
 *  in the class-level documentation.
 | 
			
		||||
 *     
 | 
			
		||||
 *     range = Xs.new(1)..Xs.new(10)
 | 
			
		||||
 *     range.step(2) {|x| puts x}
 | 
			
		||||
 *     range.step(3) {|x| puts x}
 | 
			
		||||
 *     
 | 
			
		||||
 *  <em>produces:</em>
 | 
			
		||||
 *     
 | 
			
		||||
 *      1 x
 | 
			
		||||
 *      3 xxx
 | 
			
		||||
 *      5 xxxxx
 | 
			
		||||
 *      7 xxxxxxx
 | 
			
		||||
 *      9 xxxxxxxxx
 | 
			
		||||
 *      1 x
 | 
			
		||||
 *      4 xxxx
 | 
			
		||||
 *      7 xxxxxxx
 | 
			
		||||
 *     10 xxxxxxxxxx
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_step(argc, argv, range)
 | 
			
		||||
    int argc;
 | 
			
		||||
| 
						 | 
				
			
			@ -282,6 +356,22 @@ each_i(v, arg)
 | 
			
		|||
    return rb_yield(v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng.each {| i | block } => rng
 | 
			
		||||
 *  
 | 
			
		||||
 *  Iterates over the elements <i>rng</i>, passing each in turn to the
 | 
			
		||||
 *  block.
 | 
			
		||||
 *     
 | 
			
		||||
 *     (10..15).each do |n|
 | 
			
		||||
 *        print n, ' '
 | 
			
		||||
 *     end
 | 
			
		||||
 *     
 | 
			
		||||
 *  <em>produces:</em>
 | 
			
		||||
 *     
 | 
			
		||||
 *     10 11 12 13 14 15
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_each(range)
 | 
			
		||||
    VALUE range;
 | 
			
		||||
| 
						 | 
				
			
			@ -318,6 +408,14 @@ range_each(range)
 | 
			
		|||
    return range;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng.first    => obj
 | 
			
		||||
 *     rng.begin    => obj
 | 
			
		||||
 *  
 | 
			
		||||
 *  Returns the first object in <i>rng</i>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_first(range)
 | 
			
		||||
    VALUE range;
 | 
			
		||||
| 
						 | 
				
			
			@ -325,6 +423,19 @@ range_first(range)
 | 
			
		|||
    return rb_ivar_get(range, id_beg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng.end    => obj
 | 
			
		||||
 *     rng.last   => obj
 | 
			
		||||
 *  
 | 
			
		||||
 *  Returns the object that defines the end of <i>rng</i>.
 | 
			
		||||
 *     
 | 
			
		||||
 *     (1..10).end    #=> 10
 | 
			
		||||
 *     (1...10).end   #=> 10
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_last(range)
 | 
			
		||||
    VALUE range;
 | 
			
		||||
| 
						 | 
				
			
			@ -435,6 +546,26 @@ range_member(range, val)
 | 
			
		|||
    return args[1];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  call-seq:
 | 
			
		||||
 *     rng === obj    => true or false
 | 
			
		||||
 *  
 | 
			
		||||
 *  Returns <code>true</code> if <i>obj</i> is an element of
 | 
			
		||||
 *  <i>rng</i>, <code>false</code> otherwise. Conveniently,
 | 
			
		||||
 *  <code>===</code> is the comparison operator used by
 | 
			
		||||
 *  <code>case</code> statements.
 | 
			
		||||
 *     
 | 
			
		||||
 *     case 79
 | 
			
		||||
 *     when 1..50   then   print "low\n"
 | 
			
		||||
 *     when 51..75  then   print "medium\n"
 | 
			
		||||
 *     when 76..100 then   print "high\n"
 | 
			
		||||
 *     end
 | 
			
		||||
 *     
 | 
			
		||||
 *  <em>produces:</em>
 | 
			
		||||
 *     
 | 
			
		||||
 *     high
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
range_include(range, val)
 | 
			
		||||
    VALUE range, val;
 | 
			
		||||
| 
						 | 
				
			
			@ -454,6 +585,59 @@ range_include(range, val)
 | 
			
		|||
    return Qfalse;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*  A <code>Range</code> represents an interval---a set of values with a
 | 
			
		||||
 *  start and an end. Ranges may be constructed using the
 | 
			
		||||
 *  <em>s</em><code>..</code><em>e</em> and
 | 
			
		||||
 *  <em>s</em><code>...</code><em>e</em> literals, or with
 | 
			
		||||
 *  <code>Range::new</code>. Ranges constructed using <code>..</code>
 | 
			
		||||
 *  run from the start to the end inclusively. Those created using
 | 
			
		||||
 *  <code>...</code> exclude the end value. When used as an iterator,
 | 
			
		||||
 *  ranges return each value in the sequence.
 | 
			
		||||
 *     
 | 
			
		||||
 *     (-1..-5).to_a      #=> []
 | 
			
		||||
 *     (-5..-1).to_a      #=> [-5, -4, -3, -2, -1]
 | 
			
		||||
 *     ('a'..'e').to_a    #=> ["a", "b", "c", "d", "e"]
 | 
			
		||||
 *     ('a'...'e').to_a   #=> ["a", "b", "c", "d"]
 | 
			
		||||
 *     
 | 
			
		||||
 *  Ranges can be constructed using objects of any type, as long as the
 | 
			
		||||
 *  objects can be compared using their <code><=></code> operator and
 | 
			
		||||
 *  they support the <code>succ</code> method to return the next object
 | 
			
		||||
 *  in sequence.
 | 
			
		||||
 *     
 | 
			
		||||
 *     class Xs                # represent a string of 'x's
 | 
			
		||||
 *       include Comparable
 | 
			
		||||
 *       attr :length
 | 
			
		||||
 *       def initialize(n)
 | 
			
		||||
 *         @length = n
 | 
			
		||||
 *       end
 | 
			
		||||
 *       def succ
 | 
			
		||||
 *         Xs.new(@length + 1)
 | 
			
		||||
 *       end
 | 
			
		||||
 *       def <=>(other)
 | 
			
		||||
 *         @length <=> other.length
 | 
			
		||||
 *       end
 | 
			
		||||
 *       def to_s
 | 
			
		||||
 *         sprintf "%2d #{inspect}", @length
 | 
			
		||||
 *       end
 | 
			
		||||
 *       def inspect
 | 
			
		||||
 *         'x' * @length
 | 
			
		||||
 *       end
 | 
			
		||||
 *     end
 | 
			
		||||
 *     
 | 
			
		||||
 *     r = Xs.new(3)..Xs.new(6)   #=> xxx..xxxxxx
 | 
			
		||||
 *     r.to_a                     #=> [xxx, xxxx, xxxxx, xxxxxx]
 | 
			
		||||
 *     r.member?(Xs.new(5))       #=> true
 | 
			
		||||
 *     
 | 
			
		||||
 *  In the previous code example, class <code>Xs</code> includes the
 | 
			
		||||
 *  <code>Comparable</code> module. This is because
 | 
			
		||||
 *  <code>Enumerable#member?</code> checks for equality using
 | 
			
		||||
 *  <code>==</code>. Including <code>Comparable</code> ensures that the
 | 
			
		||||
 *  <code>==</code> method is defined in terms of the <code><=></code>
 | 
			
		||||
 *  method implemented in <code>Xs</code>.
 | 
			
		||||
 *     
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Init_Range()
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue