class Numeric
Numeric ist die Klasse, von der alle übergeordneten numerischen Klassen erben sollten.
Numeric ermöglicht die Instanziierung von Heap-alloziierten Objekten. Andere Kern-Numerikklassen wie Integer werden als Immediates implementiert, was bedeutet, dass jeder Integer ein einzelnes unveränderliches Objekt ist, das immer als Wert übergeben wird.
a = 1 1.object_id == a.object_id #=> true
Es kann immer nur eine Instanz der Ganzzahl 1 geben, zum Beispiel. Ruby stellt dies sicher, indem es die Instanziierung verhindert. Wenn versucht wird, eine Duplizierung durchzuführen, wird dieselbe Instanz zurückgegeben.
Integer.new(1) #=> NoMethodError: undefined method `new' for Integer:Class 1.dup #=> 1 1.object_id == 1.dup.object_id #=> true
Aus diesem Grund sollte Numeric verwendet werden, wenn andere numerische Klassen definiert werden.
Klassen, die von Numeric erben, müssen coerce implementieren, die ein Array mit zwei Elementen zurückgibt, das ein Objekt enthält, das in eine Instanz der neuen Klasse umgewandelt wurde, und self (siehe coerce).
Erbende Klassen sollten auch arithmetische Operator-Methoden (+, -, * und /) und den <=> Operator implementieren (siehe Comparable). Diese Methoden dürfen sich auf coerce stützen, um die Interoperabilität mit Instanzen anderer numerischer Klassen sicherzustellen.
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
Was gibt es hier
Zuerst, was woanders ist. Klasse Numeric
-
Erbt von Klasse Object.
-
Enthält das Modul
Comparable.
Hier bietet die Klasse Numeric Methoden für
Abfragen
-
finite?: Gibt true zurück, es sei denn,selfist unendlich oder keine Zahl. -
infinite?: Gibt -1,niloder +1 zurück, je nachdem, obself-Infinity<tt>, endlich oder <tt>+Infinityist. -
integer?: Gibt zurück, obselfeine Ganzzahl ist. -
negative?: Gibt zurück, obselfnegativ ist. -
nonzero?: Gibt zurück, obselfnicht Null ist. -
positive?: Gibt zurück, obselfpositiv ist. -
real?: Gibt zurück, obselfein reeller Wert ist. -
zero?: Gibt zurück, obselfNull ist.
Vergleichen
-
<=>: Gibt zurück-
-1, wenn
selfkleiner als der gegebene Wert ist. -
0, wenn
selfgleich dem gegebenen Wert ist. -
1, wenn
selfgrößer als der gegebene Wert ist. -
nil, wennselfund der gegebene Wert nicht vergleichbar sind.
-
-
eql?: Gibt zurück, obselfund der gegebene Wert denselben Wert und denselben Typ haben.
Konvertieren
-
%(aliasmodulo): Gibt den Rest der Division vonselfdurch den gegebenen Wert zurück. -
-@: Gibt den Wert vonself, negiert, zurück. -
abs(aliasmagnitude): Gibt den Absolutwert vonselfzurück. -
abs2: Gibt das Quadrat vonselfzurück. -
angle(aliasargundphase): Gibt 0 zurück, wennselfpositiv ist, andernfalls Math::PI. -
ceil: Gibt die kleinste Zahl zurück, die größer oder gleichselfist, mit einer gegebenen Genauigkeit. -
coerce: Gibt das Array[coerced_self, coerced_other]für den gegebenen anderen Wert zurück. -
conj(aliasconjugate): Gibt die komplexe Konjugierte vonselfzurück. -
denominator: Gibt den Nenner (immer positiv) derRational-Darstellung vonselfzurück. -
div: Gibt den Wert vonselfgeteilt durch den gegebenen Wert zurück und in eine Ganzzahl umgewandelt. -
divmod: Gibt das Array[quotient, modulus]zurück, das sich aus der Division vonselfdurch den gegebenen Divisor ergibt. -
fdiv: Gibt dasFloat-Ergebnis der Division vonselfdurch den gegebenen Divisor zurück. -
floor: Gibt die größte Zahl zurück, die kleiner oder gleichselfist, mit einer gegebenen Genauigkeit. -
i: Gibt dasComplex-ObjektComplex(0, self)zurück. den gegebenen Wert. -
imaginary(aliasimag): Gibt den Imaginärteil vonselfzurück. -
numerator: Gibt den Zähler derRational-Darstellung vonselfzurück; hat dasselbe Vorzeichen wieself. -
polar: Gibt das Array[self.abs, self.arg]zurück. -
quo: Gibt den Wert vonselfgeteilt durch den gegebenen Wert zurück. -
real: Gibt den Realteil vonselfzurück. -
rect(aliasrectangular): Gibt das Array[self, 0]zurück. -
remainder: Gibtself-arg*(self/arg).truncatefür das gegebeneargzurück. -
round: Gibt den Wert vonselfgerundet auf den nächsten Wert für eine gegebene Genauigkeit zurück. -
to_int: Gibt dieInteger-Darstellung vonselfzurück, wobei bei Bedarf abgeschnitten wird. -
truncate: Gibtselfabgeschnitten (in Richtung Null) auf eine gegebene Genauigkeit zurück.
Sonstiges
Öffentliche Instanzmethoden
Source
static VALUE
num_modulo(VALUE x, VALUE y)
{
VALUE q = num_funcall1(x, id_div, y);
return rb_funcall(x, '-', 1,
rb_funcall(y, '*', 1, q));
}
Gibt self modulo other als reelle Zahl (Integer, Float oder Rational) zurück.
Von den Kern- und Standardbibliotheksklassen verwendet nur Rational diese Implementierung.
Für Rational r und reelle Zahl n sind diese Ausdrücke äquivalent
r % n r-n*(r/n).floor r.divmod(n)[1]
Siehe Numeric#divmod.
Beispiele
r = Rational(1, 2) # => (1/2) r2 = Rational(2, 3) # => (2/3) r % r2 # => (1/2) r % 2 # => (1/2) r % 2.0 # => 0.5 r = Rational(301,100) # => (301/100) r2 = Rational(7,5) # => (7/5) r % r2 # => (21/100) r % -r2 # => (-119/100) (-r) % r2 # => (119/100) (-r) %-r2 # => (-21/100)
Source
static VALUE
num_uminus(VALUE num)
{
VALUE zero;
zero = INT2FIX(0);
do_coerce(&zero, &num, TRUE);
return num_funcall1(zero, '-', num);
}
Gibt self zurück, negiert.
Source
static VALUE
num_cmp(VALUE x, VALUE y)
{
if (x == y) return INT2FIX(0);
return Qnil;
}
Vergleicht self und other.
Gibt zurück
-
Null, wenn
selfdasselbe wieotherist. -
nil, andernfalls.
Die Klasse Numeric enthält das Modul Comparable, dessen Methoden Numeric#<=> für Vergleiche verwenden.
Keine Unterklasse in der Ruby-Kern- oder Standardbibliothek verwendet diese Implementierung.
Source
static VALUE
num_abs(VALUE num)
{
if (rb_num_negative_int_p(num)) {
return num_funcall0(num, idUMinus);
}
return num;
}
Gibt den Absolutwert von self zurück.
12.abs #=> 12 (-34.56).abs #=> 34.56 -34.56.abs #=> 34.56
Source
static VALUE
numeric_abs2(VALUE self)
{
return f_mul(self, self);
}
Gibt das Quadrat von self zurück.
Source
static VALUE
numeric_arg(VALUE self)
{
if (f_positive_p(self))
return INT2FIX(0);
return DBL2NUM(M_PI);
}
Gibt Null zurück, wenn self positiv ist, andernfalls Math::PI.
Source
static VALUE
num_ceil(int argc, VALUE *argv, VALUE num)
{
return flo_ceil(argc, argv, rb_Float(num));
}
Gibt die kleinste Gleitkommazahl oder Ganzzahl zurück, die größer oder gleich self ist, wie durch die gegebene ndigits angegeben, die ein integer-konvertierbares Objekt sein muss.
Äquivalent zu self.to_f.ceil(ndigits).
Verwandt: floor, Float#ceil.
Source
static VALUE
num_clone(int argc, VALUE *argv, VALUE x)
{
return rb_immutable_obj_clone(argc, argv, x);
}
Gibt self zurück.
Löst eine Ausnahme aus, wenn der Wert für freeze weder true noch nil ist.
Verwandt: Numeric#dup.
Source
static VALUE
num_coerce(VALUE x, VALUE y)
{
if (CLASS_OF(x) == CLASS_OF(y))
return rb_assoc_new(y, x);
x = rb_Float(x);
y = rb_Float(y);
return rb_assoc_new(y, x);
}
Gibt ein 2-elementiges Array zurück, das zwei numerische Elemente enthält, die aus den beiden Operanden self und other eines gemeinsamen kompatiblen Typs gebildet werden.
Von den Kern- und Standardbibliotheksklassen verwenden Integer, Rational und Complex diese Implementierung.
Beispiele
i = 2 # => 2 i.coerce(3) # => [3, 2] i.coerce(3.0) # => [3.0, 2.0] i.coerce(Rational(1, 2)) # => [0.5, 2.0] i.coerce(Complex(3, 4)) # Raises RangeError. r = Rational(5, 2) # => (5/2) r.coerce(2) # => [(2/1), (5/2)] r.coerce(2.0) # => [2.0, 2.5] r.coerce(Rational(2, 3)) # => [(2/3), (5/2)] r.coerce(Complex(3, 4)) # => [(3+4i), ((5/2)+0i)] c = Complex(2, 3) # => (2+3i) c.coerce(2) # => [(2+0i), (2+3i)] c.coerce(2.0) # => [(2.0+0i), (2+3i)] c.coerce(Rational(1, 2)) # => [((1/2)+0i), (2+3i)] c.coerce(Complex(3, 4)) # => [(3+4i), (2+3i)]
Löst eine Ausnahme aus, wenn eine Typkonvertierung fehlschlägt.
Source
static VALUE
numeric_denominator(VALUE self)
{
return f_denominator(f_to_r(self));
}
Gibt den Nenner (immer positiv) zurück.
Source
static VALUE
num_div(VALUE x, VALUE y)
{
if (rb_equal(INT2FIX(0), y)) rb_num_zerodiv();
return rb_funcall(num_funcall1(x, '/', y), rb_intern("floor"), 0);
}
Source
static VALUE
num_divmod(VALUE x, VALUE y)
{
return rb_assoc_new(num_div(x, y), num_modulo(x, y));
}
Gibt ein 2-elementiges Array [q, r] zurück, wobei
q = (self/other).floor # Quotient r = self % other # Remainder
Von den Kern- und Standardbibliotheksklassen verwendet nur Rational diese Implementierung.
Beispiele
Rational(11, 1).divmod(4) # => [2, (3/1)] Rational(11, 1).divmod(-4) # => [-3, (-1/1)] Rational(-11, 1).divmod(4) # => [-3, (1/1)] Rational(-11, 1).divmod(-4) # => [2, (-3/1)] Rational(12, 1).divmod(4) # => [3, (0/1)] Rational(12, 1).divmod(-4) # => [-3, (0/1)] Rational(-12, 1).divmod(4) # => [-3, (0/1)] Rational(-12, 1).divmod(-4) # => [3, (0/1)] Rational(13, 1).divmod(4.0) # => [3, 1.0] Rational(13, 1).divmod(Rational(4, 11)) # => [35, (3/11)]
Source
static VALUE
num_eql(VALUE x, VALUE y)
{
if (TYPE(x) != TYPE(y)) return Qfalse;
if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_eql(x, y);
}
return rb_equal(x, y);
}
Gibt zurück, ob self und other denselben Typ haben und gleiche Werte haben.
Von den Kern- und Standardbibliotheksklassen verwenden nur Integer, Rational und Complex diese Implementierung.
Beispiele
1.eql?(1) # => true 1.eql?(1.0) # => false 1.eql?(Rational(1, 1)) # => false 1.eql?(Complex(1, 0)) # => false
Die Methode eql? unterscheidet sich von == dadurch, dass eql? übereinstimmende Typen erfordert, während == dies nicht tut.
Source
static VALUE
num_fdiv(VALUE x, VALUE y)
{
return rb_funcall(rb_Float(x), '/', 1, y);
}
Gibt den Quotienten self/other als Gleitkommazahl zurück, wobei die Methode / wie in der Unterklasse von Numeric definiert verwendet wird. (Numeric selbst definiert / nicht.)
Von den Kern- und Standardbibliotheksklassen verwendet nur BigDecimal diese Implementierung.
Source
# File numeric.rb, line 48 def finite? true end
Gibt true zurück, wenn self eine endliche Zahl ist, andernfalls false.
Source
static VALUE
num_floor(int argc, VALUE *argv, VALUE num)
{
return flo_floor(argc, argv, rb_Float(num));
}
Gibt die größte Gleitkommazahl oder Ganzzahl zurück, die kleiner oder gleich self ist, wie durch die gegebene ndigits angegeben, die ein integer-konvertierbares Objekt sein muss.
Äquivalent zu self.to_f.floor(ndigits).
Verwandt: ceil, Float#floor.
Source
static VALUE
num_imaginary(VALUE num)
{
return rb_complex_new(INT2FIX(0), num);
}
Gibt Complex(0, self) zurück.
2.i # => (0+2i) -2.i # => (0-2i) 2.0.i # => (0+2.0i) Rational(1, 2).i # => (0+(1/2)*i) Complex(3, 4).i # Raises NoMethodError.
Source
# File numeric.rb, line 58 def infinite? nil end
Gibt nil, -1 oder 1 zurück, je nachdem, ob self endlich, -Infinity oder +Infinity ist.
Source
# File numeric.rb, line 39 def integer? false end
Gibt true zurück, wenn self eine Integer ist.
1.0.integer? # => false 1.integer? # => true
Source
static VALUE
num_negative_p(VALUE num)
{
return RBOOL(rb_num_negative_int_p(num));
}
Gibt true zurück, wenn self kleiner als 0 ist, andernfalls false.
Source
static VALUE
num_nonzero_p(VALUE num)
{
if (RTEST(num_funcall0(num, rb_intern("zero?")))) {
return Qnil;
}
return num;
}
Gibt self zurück, wenn self kein Nullwert ist, andernfalls nil; verwendet die Methode zero? zur Auswertung.
Das zurückgegebene self ermöglicht die Verkettung der Methode
a = %w[z Bb bB bb BB a aA Aa AA A] a.sort {|a, b| (a.downcase <=> b.downcase).nonzero? || a <=> b } # => ["A", "a", "AA", "Aa", "aA", "BB", "Bb", "bB", "bb", "z"]
Von den Kern- und Standardbibliotheksklassen verwenden Integer, Float, Rational und Complex diese Implementierung.
Verwandt: zero?
Source
static VALUE
numeric_numerator(VALUE self)
{
return f_numerator(f_to_r(self));
}
Gibt den Zähler zurück.
Source
static VALUE
numeric_polar(VALUE self)
{
VALUE abs, arg;
if (RB_INTEGER_TYPE_P(self)) {
abs = rb_int_abs(self);
arg = numeric_arg(self);
}
else if (RB_FLOAT_TYPE_P(self)) {
abs = rb_float_abs(self);
arg = float_arg(self);
}
else if (RB_TYPE_P(self, T_RATIONAL)) {
abs = rb_rational_abs(self);
arg = numeric_arg(self);
}
else {
abs = f_abs(self);
arg = f_arg(self);
}
return rb_assoc_new(abs, arg);
}
Gibt das Array [self.abs, self.arg] zurück.
Source
static VALUE
num_positive_p(VALUE num)
{
const ID mid = '>';
if (FIXNUM_P(num)) {
if (method_basic_p(rb_cInteger))
return RBOOL((SIGNED_VALUE)num > (SIGNED_VALUE)INT2FIX(0));
}
else if (RB_BIGNUM_TYPE_P(num)) {
if (method_basic_p(rb_cInteger))
return RBOOL(BIGNUM_POSITIVE_P(num) && !rb_bigzero_p(num));
}
return rb_num_compare_with_zero(num, mid);
}
Gibt true zurück, wenn self größer als 0 ist, andernfalls false.
Source
VALUE
rb_numeric_quo(VALUE x, VALUE y)
{
if (RB_TYPE_P(x, T_COMPLEX)) {
return rb_complex_div(x, y);
}
if (RB_FLOAT_TYPE_P(y)) {
return rb_funcallv(x, idFdiv, 1, &y);
}
x = rb_convert_type(x, T_RATIONAL, "Rational", "to_r");
return rb_rational_div(x, y);
}
Gibt die exakteste Division zurück (rational für Ganzzahlen, float für Floats).
Source
# File numeric.rb, line 18 def real? true end
Gibt true zurück, wenn self eine reelle Zahl ist (d.h. keine Complex).
Source
static VALUE
numeric_rect(VALUE self)
{
return rb_assoc_new(self, INT2FIX(0));
}
Source
static VALUE
num_remainder(VALUE x, VALUE y)
{
if (!rb_obj_is_kind_of(y, rb_cNumeric)) {
do_coerce(&x, &y, TRUE);
}
VALUE z = num_funcall1(x, '%', y);
if ((!rb_equal(z, INT2FIX(0))) &&
((rb_num_negative_int_p(x) &&
rb_num_positive_int_p(y)) ||
(rb_num_positive_int_p(x) &&
rb_num_negative_int_p(y)))) {
if (RB_FLOAT_TYPE_P(y)) {
if (isinf(RFLOAT_VALUE(y))) {
return x;
}
}
return rb_funcall(z, '-', 1, y);
}
return z;
}
Gibt den Rest nach der Division von self durch other zurück.
Von den Kern- und Standardbibliotheksklassen verwenden nur Float und Rational diese Implementierung.
Beispiele
11.0.remainder(4) # => 3.0 11.0.remainder(-4) # => 3.0 -11.0.remainder(4) # => -3.0 -11.0.remainder(-4) # => -3.0 12.0.remainder(4) # => 0.0 12.0.remainder(-4) # => 0.0 -12.0.remainder(4) # => -0.0 -12.0.remainder(-4) # => -0.0 13.0.remainder(4.0) # => 1.0 13.0.remainder(Rational(4, 1)) # => 1.0 Rational(13, 1).remainder(4) # => (1/1) Rational(13, 1).remainder(-4) # => (1/1) Rational(-13, 1).remainder(4) # => (-1/1) Rational(-13, 1).remainder(-4) # => (-1/1)
Source
static VALUE
num_round(int argc, VALUE* argv, VALUE num)
{
return flo_round(argc, argv, rb_Float(num));
}
Gibt self gerundet auf den nächsten Wert mit einer Präzision von digits Dezimalstellen zurück.
Numeric implementiert dies, indem self in einen Float konvertiert und Float#round aufgerufen wird.
Source
static VALUE
num_step(int argc, VALUE *argv, VALUE from)
{
VALUE to, step;
int desc, inf;
if (!rb_block_given_p()) {
VALUE by = Qundef;
num_step_extract_args(argc, argv, &to, &step, &by);
if (!UNDEF_P(by)) {
step = by;
}
if (NIL_P(step)) {
step = INT2FIX(1);
}
else if (rb_equal(step, INT2FIX(0))) {
rb_raise(rb_eArgError, "step can't be 0");
}
if ((NIL_P(to) || rb_obj_is_kind_of(to, rb_cNumeric)) &&
rb_obj_is_kind_of(step, rb_cNumeric)) {
return rb_arith_seq_new(from, ID2SYM(rb_frame_this_func()), argc, argv,
num_step_size, from, to, step, FALSE);
}
return SIZED_ENUMERATOR_KW(from, 2, ((VALUE [2]){to, step}), num_step_size, FALSE);
}
desc = num_step_scan_args(argc, argv, &to, &step, TRUE, FALSE);
if (rb_equal(step, INT2FIX(0))) {
inf = 1;
}
else if (RB_FLOAT_TYPE_P(to)) {
double f = RFLOAT_VALUE(to);
inf = isinf(f) && (signbit(f) ? desc : !desc);
}
else inf = 0;
if (FIXNUM_P(from) && (inf || FIXNUM_P(to)) && FIXNUM_P(step)) {
long i = FIX2LONG(from);
long diff = FIX2LONG(step);
if (inf) {
for (;; i += diff)
rb_yield(LONG2FIX(i));
}
else {
long end = FIX2LONG(to);
if (desc) {
for (; i >= end; i += diff)
rb_yield(LONG2FIX(i));
}
else {
for (; i <= end; i += diff)
rb_yield(LONG2FIX(i));
}
}
}
else if (!ruby_float_step(from, to, step, FALSE, FALSE)) {
VALUE i = from;
if (inf) {
for (;; i = rb_funcall(i, '+', 1, step))
rb_yield(i);
}
else {
ID cmp = desc ? '<' : '>';
for (; !RTEST(rb_funcall(i, cmp, 1, to)); i = rb_funcall(i, '+', 1, step))
rb_yield(i);
}
}
return from;
}
Generiert eine Sequenz von Zahlen; mit einem gegebenen Block wird die Sequenz durchlaufen.
Von den Kern- und Standardbibliotheksklassen verwenden Integer, Float und Rational diese Implementierung.
Ein schnelles Beispiel
squares = [] 1.step(by: 2, to: 10) {|i| squares.push(i*i) } squares # => [1, 9, 25, 49, 81]
Die generierte Sequenz
-
Beginnt mit
self. -
Setzt sich fort in Intervallen von
by(was nicht Null sein darf). -
Endet mit der letzten Zahl, die innerhalb oder gleich
toist; das heißt, kleiner oder gleichto, wennbypositiv ist, größer oder gleichto, wennbynegativ ist. Wenntonilist, ist die Sequenz unendlich lang.
Wenn ein Block gegeben ist, ruft er den Block mit jeder Zahl in der Sequenz auf; gibt self zurück. Wenn kein Block gegeben ist, gibt er einen Enumerator::ArithmeticSequence zurück.
Schlüsselwortargumente
Mit Schlüsselwortargumenten by und to bestimmen deren Werte (oder Standardwerte) die Schrittweite und Grenze
# Both keywords given. squares = [] 4.step(by: 2, to: 10) {|i| squares.push(i*i) } # => 4 squares # => [16, 36, 64, 100] cubes = [] 3.step(by: -1.5, to: -3) {|i| cubes.push(i*i*i) } # => 3 cubes # => [27.0, 3.375, 0.0, -3.375, -27.0] squares = [] 1.2.step(by: 0.2, to: 2.0) {|f| squares.push(f*f) } squares # => [1.44, 1.9599999999999997, 2.5600000000000005, 3.24, 4.0] squares = [] Rational(6/5).step(by: 0.2, to: 2.0) {|r| squares.push(r*r) } squares # => [1.0, 1.44, 1.9599999999999997, 2.5600000000000005, 3.24, 4.0] # Only keyword to given. squares = [] 4.step(to: 10) {|i| squares.push(i*i) } # => 4 squares # => [16, 25, 36, 49, 64, 81, 100] # Only by given. # Only keyword by given squares = [] 4.step(by:2) {|i| squares.push(i*i); break if i > 10 } squares # => [16, 36, 64, 100, 144] # No block given. e = 3.step(by: -1.5, to: -3) # => (3.step(by: -1.5, to: -3)) e.class # => Enumerator::ArithmeticSequence
Positionsargumente
Mit optionalen Positionsargumenten to und by bestimmen deren Werte (oder Standardwerte) die Schrittweite und Grenze
squares = [] 4.step(10, 2) {|i| squares.push(i*i) } # => 4 squares # => [16, 36, 64, 100] squares = [] 4.step(10) {|i| squares.push(i*i) } squares # => [16, 25, 36, 49, 64, 81, 100] squares = [] 4.step {|i| squares.push(i*i); break if i > 10 } # => nil squares # => [16, 25, 36, 49, 64, 81, 100, 121]
Implementierungsnotizen
Wenn alle Argumente Ganzzahlen sind, operiert die Schleife mit einem Ganzzahlzähler.
Wenn eines der Argumente eine Gleitkommazahl ist, werden alle in Gleitkommazahlen konvertiert und die Schleife wird floor(n + n*Float::EPSILON) + 1 Mal ausgeführt, wobei n = (limit - self)/step.
Source
static VALUE
numeric_to_c(VALUE self)
{
return rb_complex_new1(self);
}
Gibt self als Complex-Objekt zurück.
Source
static VALUE
num_to_int(VALUE num)
{
return num_funcall0(num, id_to_i);
}
Gibt self als Ganzzahl zurück; konvertiert über die Methode to_i in der Unterklasse von Numeric. (Numeric selbst definiert to_i nicht.)
Von den Kern- und Standardbibliotheksklassen verwenden nur Rational und Complex diese Implementierung.
Beispiele
Rational(1, 2).to_int # => 0 Rational(2, 1).to_int # => 2 Complex(2, 0).to_int # => 2 Complex(2, 1).to_int # Raises RangeError (non-zero imaginary part)
Source
static VALUE
num_truncate(int argc, VALUE *argv, VALUE num)
{
return flo_truncate(argc, argv, rb_Float(num));
}
Gibt self abgeschnitten (in Richtung Null) auf eine Präzision von digits Dezimalstellen zurück.
Numeric implementiert dies, indem self in einen Float konvertiert und Float#truncate aufgerufen wird.
Source
static VALUE
num_zero_p(VALUE num)
{
return rb_equal(num, INT2FIX(0));
}