[types] OMG SO MUCH LIFETIME NONSENSE

This commit is contained in:
Eryn Wells 2018-09-01 08:33:45 -07:00
parent 1e12508348
commit 576b81e52c
2 changed files with 9 additions and 7 deletions

View file

@ -17,16 +17,18 @@ impl Number for Int {
} }
impl PartialEq<Obj> for Int { impl PartialEq<Obj> for Int {
fn eq(&self, rhs: &Obj) -> bool { fn eq<'a>(&self, rhs: &'a Obj) -> bool {
match rhs.obj().and_then(Object::as_num) { let obj: Option<&'a Object> = rhs.obj();
let num: Option<&'a Number> = obj.and_then(Object::as_num);
match num {
Some(num) => self == num, Some(num) => self == num,
None => false None => false
} }
} }
} }
impl PartialEq<Number> for Int { impl<'a> PartialEq<Number + 'a> for Int {
fn eq(&self, rhs: &Number) -> bool { fn eq(&self, rhs: &(Number + 'a)) -> bool {
match rhs.as_int() { match rhs.as_int() {
Some(rhs) => *self == *rhs, Some(rhs) => *self == *rhs,
None => false None => false

View file

@ -44,11 +44,11 @@ pub trait Object:
} }
impl Obj { impl Obj {
pub fn new<T: 'static + Object>(obj: T) -> Obj { pub fn new<T: Object + 'static>(obj: T) -> Obj {
Obj::Ptr(Box::new(obj)) Obj::Ptr(Box::new(obj))
} }
pub fn obj<'a>(&'a self) -> Option<&'a Object> { pub fn obj<'s, 'r: 's>(&'s self) -> Option<&'r (Object + 's)> {
match self { match self {
Obj::Ptr(obj) => Some(obj.deref()), Obj::Ptr(obj) => Some(obj.deref()),
Obj::Null => None Obj::Null => None
@ -60,7 +60,7 @@ impl Obj {
mem::replace(self, Obj::Null) mem::replace(self, Obj::Null)
} }
pub fn unbox_as<T: 'static + Object>(&self) -> Option<&T> { pub fn unbox_as<T: Object + 'static>(&self) -> Option<&T> {
match self { match self {
Obj::Null => None, Obj::Null => None,
Obj::Ptr(obj) => obj.as_any().downcast_ref::<T>() Obj::Ptr(obj) => obj.as_any().downcast_ref::<T>()