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_int
method, callvalue.to_int
:- If
value.to_int
raises an exception, propagate that exception. - If
value.to_int
returns a Ruby integer, return the inner integer. - If
value.to_int
returs any other type, return aTypeError
.
- If
- If the given value does not respond to the
:to_int
method, 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_int
method. - The given value is not an integer and raises an error in its
:to_int
method.