Treats:

    Numeric#coerce
    Numeric#clone
    Numeric#dup
    Numeric#@+ (unary plus)
    Numeric#i
    Float#coerce
This commit is contained in:
Burdette Lamar 2021-10-18 18:35:06 -05:00 коммит произвёл GitHub
Родитель 8bc2443803
Коммит 012cafa5c7
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 63 добавлений и 27 удалений

Просмотреть файл

@ -387,19 +387,37 @@ num_funcall1(VALUE x, ID func, VALUE y)
/* /*
* call-seq: * call-seq:
* num.coerce(numeric) -> array * coerce(other) -> array
* *
* If +numeric+ is the same type as +num+, returns an array * Returns a 2-element array containing two numeric elements,
* <code>[numeric, num]</code>. Otherwise, returns an array with both * formed from the two operands +self+ and +other+,
* +numeric+ and +num+ represented as Float objects. * of a common compatible type.
* *
* This coercion mechanism is used by Ruby to handle mixed-type numeric * Of the Core and Standard Library classes,
* operations: it is intended to find a compatible common type between the two * Integer, Rational, and Complex use this implementation.
* operands of the operator. *
* Examples:
*
* 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)]
*
* Raises an exception if any type conversion fails.
* *
* 1.coerce(2.5) #=> [2.5, 1.0]
* 1.2.coerce(3) #=> [3.0, 1.2]
* 1.coerce(2) #=> [2, 1]
*/ */
static VALUE static VALUE
@ -509,9 +527,14 @@ num_sadded(VALUE x, VALUE name)
#if 0 #if 0
/* /*
* call-seq: * call-seq:
* num.clone(freeze: true) -> num * clone(freeze: true) -> self
*
* Returns +self+.
*
* Raises an exception if the value for +freeze+ is neither +true+ nor +nil+.
*
* Related: Numeric#dup.
* *
* Returns the receiver. +freeze+ cannot be +false+.
*/ */
static VALUE static VALUE
num_clone(int argc, VALUE *argv, VALUE x) num_clone(int argc, VALUE *argv, VALUE x)
@ -525,9 +548,12 @@ num_clone(int argc, VALUE *argv, VALUE x)
#if 0 #if 0
/* /*
* call-seq: * call-seq:
* num.dup -> num * dup -> self
*
* Returns +self+.
*
* Related: Numeric#clone.
* *
* Returns the receiver.
*/ */
static VALUE static VALUE
num_dup(VALUE x) num_dup(VALUE x)
@ -540,9 +566,10 @@ num_dup(VALUE x)
/* /*
* call-seq: * call-seq:
* +num -> num * +num -> self
*
* Returns +self+.
* *
* Unary Plus---Returns the receiver.
*/ */
static VALUE static VALUE
@ -553,13 +580,16 @@ num_uplus(VALUE num)
/* /*
* call-seq: * call-seq:
* num.i -> Complex(0, num) * i -> complex
* *
* Returns the corresponding imaginary number. * Returns <tt>Complex(0, self)</tt>:
* Not available for complex numbers. *
* 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.
* *
* -42.i #=> (0-42i)
* 2.0.i #=> (0+2.0i)
*/ */
static VALUE static VALUE
@ -985,15 +1015,21 @@ flo_to_s(VALUE flt)
/* /*
* call-seq: * call-seq:
* float.coerce(numeric) -> array * coerce(other) -> array
* *
* Returns an array with both +numeric+ and +float+ represented as Float * Returns a 2-element array containing +other+ converted to a \Float
* objects. * and +self+:
* *
* This is achieved by converting +numeric+ to a Float. * f = 3.14 # => 3.14
* f.coerce(2) # => [2.0, 3.14]
* f.coerce(2.0) # => [2.0, 3.14]
* f.coerce(Rational(1, 2)) # => [0.5, 3.14]
* f.coerce(Complex(3, 4)) # Raises RangeError.
*
* Related: Numeric#coerce (for other numeric types).
*
* Raises an exception if a type conversion fails.
* *
* 1.2.coerce(3) #=> [3.0, 1.2]
* 2.5.coerce(1.1) #=> [1.1, 2.5]
*/ */
static VALUE static VALUE