pub fn implicitly_convert_to_int(
interp: &mut Artichoke,
value: Value,
) -> Result<i64, Error>Expand description
Attempt to implicitly convert a Value to an integer.
Attempt to extract an i64 from the given Value by trying the following
conversions:
- If the given value is a Ruby integer, return the inner integer.
- If the given value is
nil, return aTypeError. - If the given value responds to the
:to_intmethod, callvalue.to_int:- If
value.to_intraises an exception, propagate that exception. - If
value.to_intreturns a Ruby integer, return the inner integer. - If
value.to_intreturs any other type, return aTypeError.
- If
- If the given value does not respond to the
:to_intmethod, return aTypeError.
Floats and other numeric types are not coerced to integer by this implicit conversion.
§Examples
let mut interp = artichoke_backend::interpreter()?;
// successful conversions
let integer = interp.convert(17);
let a = interp.eval(b"class A; def to_int; 3; end; end; A.new")?;
assert!(matches!(
implicitly_convert_to_int(&mut interp, integer),
Ok(17)
));
assert!(matches!(implicitly_convert_to_int(&mut interp, a), Ok(3)));
// failed conversions
let nil = Value::nil();
let b = interp.eval(b"class B; end; B.new")?;
let c = interp.eval(b"class C; def to_int; nil; end; end; C.new")?;
let d = interp.eval(b"class D; def to_int; 'not an integer'; end; end; D.new")?;
let e = interp.eval(b"class E; def to_int; 3.2; end; end; E.new")?;
let f = interp
.eval(b"class F; def to_int; raise ArgumentError, 'not an integer'; end; end; F.new")?;
assert!(implicitly_convert_to_int(&mut interp, nil).is_err());
assert!(implicitly_convert_to_int(&mut interp, b).is_err());
assert!(implicitly_convert_to_int(&mut interp, c).is_err());
assert!(implicitly_convert_to_int(&mut interp, d).is_err());
assert!(implicitly_convert_to_int(&mut interp, e).is_err());
assert!(implicitly_convert_to_int(&mut interp, f).is_err());§Errors
This function returns an error if:
- The given value is
nil. - The given value is not an integer and does not respond to
:to_int. - The given value is not an integer and returns a non-integer value from its
:to_intmethod. - The given value is not an integer and raises an error in its
:to_intmethod.