On 2014-05-30, at 4:16, Eric Reed <[email protected]> wrote:
> That was what I was referencing in my comment about the compiler getting
> scared and confused. Theoretically, it should be allowed and the compiler
> would just require you to specify, but rustc may not be there yet.
Are you saying that the compiler should be able to handle the following snippet
in the future?
(currently it says "error: conflicting implementations for trait `Foo`")
trait Foo {
fn foo(&self);
}
impl<X, T: Iterator<X>> Foo for T {
fn foo(&self) { /* arg implements Iterator */ }
}
impl<X, T: RandomAccessIterator<X>> Foo for T {
fn foo(&self) { /* arg implements RandomAccessIterator */ }
}
I guess this could be called trait implementation overloading and it
accomplishes the same goal as function overloading; if there is some overlap
between two or more impl's, then the compiler should always use the "most
specialized one" of the ones that could be used.
D language has, I think, a nice and simple way of specifying how function
overloading works:
Given two functions foo1 and foo2...
1) If foo1 can be called with arguments that have the parameter types of foo2
and if foo2 cannot be called with the parameter types of foo1, then foo2 is
"more specialized" than foo1.
2) If foo1 can be called with arguments that have the parameter types of foo2
and if foo2 can be called with the parameter types of foo1, then foo1 and foo2
are "equally specialized".
This way the "most specialized" function is determined and the function call
should resolve to that one. Function overloading is not allowed among functions
that are defined in different modules (to prevent what they call "function
hijacking"). And obviously, if there are multiple "most specialized" functions
that are "equally specialized", then that's an ambiguity error.
I remember seeing an edge case that showed that this way in which D specifies
function overloading is in some way inferior to the way C++ specifies it. But
the D way is a lot simpler to reason about.
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev