Method: Rational#coerce

Defined in:
rational.c

#coerce(other) ⇒ Object

:nodoc:



1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
# File 'rational.c', line 1174

static VALUE
nurat_coerce(VALUE self, VALUE other)
{
    if (RB_INTEGER_TYPE_P(other)) {
        return rb_assoc_new(f_rational_new_bang1(CLASS_OF(self), other), self);
    }
    else if (RB_FLOAT_TYPE_P(other)) {
        return rb_assoc_new(other, nurat_to_f(self));
    }
    else if (RB_TYPE_P(other, T_RATIONAL)) {
        return rb_assoc_new(other, self);
    }
    else if (RB_TYPE_P(other, T_COMPLEX)) {
        if (!k_exact_zero_p(RCOMPLEX(other)->imag))
            return rb_assoc_new(other, rb_Complex(self, INT2FIX(0)));
        other = RCOMPLEX(other)->real;
        if (RB_FLOAT_TYPE_P(other)) {
            other = float_to_r(other);
            RBASIC_SET_CLASS(other, CLASS_OF(self));
        }
        else {
            other = f_rational_new_bang1(CLASS_OF(self), other);
        }
        return rb_assoc_new(other, self);
    }

    rb_raise(rb_eTypeError, "%s can't be coerced into %s",
             rb_obj_classname(other), rb_obj_classname(self));
    return Qnil;
}