aboutsummaryrefslogtreecommitdiffstats
path: root/numeric.c
diff options
context:
space:
mode:
authorzzak <zzak@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-05 06:42:14 +0000
committerzzak <zzak@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-05 06:42:14 +0000
commit2c5a139a84b6ec3f895c698d37fdc4d2043a2168 (patch)
treeda1444e635418653503faf6837689b87f2590cdf /numeric.c
parent2475db57649d7c591d6b521aee981a731702ec49 (diff)
downloadruby-2c5a139a84b6ec3f895c698d37fdc4d2043a2168.tar.gz
* numeric.c: [DOC] Overview for Numeric class by Joe Corcoran
This patch was created at ROSSConf Berlin 2015 [Bug #11555] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52037 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/numeric.c b/numeric.c
index 32c9fcb8e3..e93c871d83 100644
--- a/numeric.c
+++ b/numeric.c
@@ -4071,7 +4071,75 @@ fix_even_p(VALUE num)
*/
/*
- * The top-level number class.
+ * Document-class: Numeric
+ *
+ * Numeric is the class from which all higher-level numeric classes should inherit.
+ *
+ * Numeric allows instantiation of heap-allocated objects. Other core numeric classes such as
+ * Integer are implemented as immediates, which means that each Integer is a single immutable
+ * object which is always passed by value.
+ *
+ * a = 1
+ * puts 1.object_id == a.object_id #=> true
+ *
+ * There can only ever be one instance of the integer +1+, for example. Ruby ensures this
+ * by preventing instantiation and duplication.
+ *
+ * Integer.new(1) #=> NoMethodError: undefined method `new' for Integer:Class
+ * 1.dup #=> TypeError: can't dup Fixnum
+ *
+ * For this reason, Numeric should be used when defining other numeric classes.
+ *
+ * Classes which inherit from Numeric must implement +coerce+, which returns a two-member
+ * Array containing an object that has been coerced into an instance of the new class
+ * and +self+ (see #coerce).
+ *
+ * Inheriting classes should also implement arithmetic operator methods (<code>+</code>,
+ * <code>-</code>, <code>*</code> and <code>/</code>) and the <code><=></code> operator (see
+ * Comparable). These methods may rely on +coerce+ to ensure interoperability with
+ * instances of other numeric classes.
+ *
+ * class Tally < Numeric
+ * def initialize(string)
+ * @string = string
+ * end
+ *
+ * def to_s
+ * @string
+ * end
+ *
+ * def to_i
+ * @string.size
+ * end
+ *
+ * def coerce(other)
+ * [self.class.new('|' * other.to_i), self]
+ * end
+ *
+ * def <=>(other)
+ * to_i <=> other.to_i
+ * end
+ *
+ * def +(other)
+ * self.class.new('|' * (to_i + other.to_i))
+ * end
+ *
+ * def -(other)
+ * self.class.new('|' * (to_i - other.to_i))
+ * end
+ *
+ * def *(other)
+ * self.class.new('|' * (to_i * other.to_i))
+ * end
+ *
+ * def /(other)
+ * self.class.new('|' * (to_i / other.to_i))
+ * end
+ * end
+ *
+ * tally = Tally.new('||')
+ * puts tally * 2 #=> "||||"
+ * puts tally > 1 #=> true
*/
void
Init_Numeric(void)