fn sub(vm: &mut VM, self_val: Value, args: &Args2) -> VMResult {
    args.check_args_num(1)?;
    let time = self_val.as_time().clone();
    let arg0 = vm[0];
    match arg0.unpack() {
        RV::Integer(i) => {
            let res = time - Duration::seconds(i);
            Ok(Value::time(vm.globals.get_class(self_val), res))
        }
        RV::Float(f) => {
            let offset = (f * 1000.0 * 1000.0 * 1000.0) as i64;
            let res = time - Duration::nanoseconds(offset);
            Ok(Value::time(vm.globals.get_class(self_val), res))
        }
        RV::Object(rv) => match rv.kind() {
            ObjKind::TIME => {
                let res = time - rv.time().clone();
                let offset = (res.num_nanoseconds().unwrap() as f64) / 1000.0 / 1000.0 / 1000.0;
                Ok(Value::float(offset))
            }
            _ => return Err(VMError::undefined_op("-", arg0, self_val)),
        },
        _ => return Err(VMError::undefined_op("-", arg0, self_val)),
    }
}
self - time -> Float
self - sec -> Time
https://docs.ruby-lang.org/ja/latest/method/Time/i/=2d.html
ruruby/src/builtin/time.rs