I think it's fine to remove this test, just because it's old and cruft and
not hard to reproduce. *However* it should eventually be possible to
implement the same interface for the same type multiple times with
different type parameters, it's just that our current trait implementation
has accidental limitations.


On Thu, Apr 18, 2013 at 6:30 PM, John Clements <[email protected]>wrote:

> the "issue-2185.rs" test was xfailed with a ref to #2263. Issue #2263 is
> now fixed, so I tried it again, and after adding some &self parameters, I
> got this error:
>
> Running /usr/local/bin/rustc:
> issue-2185.rs:24:0: 26:1 error: conflicting implementations for a trait
> issue-2185.rs:24 impl iterable<uint> for @fn(&fn(uint)) {
> issue-2185.rs:25     fn iter(&self, blk: &fn(v: uint)) { self( |i| blk(i)
> ) }
> issue-2185.rs:26 }
> issue-2185.rs:20:0: 22:1 note: note conflicting implementation here
> issue-2185.rs:20 impl<A> iterable<A> for @fn(&fn(A)) {
> issue-2185.rs:21     fn iter(&self, blk: &fn(A)) { self(blk); }
> issue-2185.rs:22 }
>
> … so it looks like it's just not possible to implement both the generic
> iterable<uint> and iterable<A> for the type iterable<uint>. Is it okay if I
> just remove this test?
>
> John
>
> (text of slightly-patched issue-2185.rs follows:)
>
> // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
> // file at the top-level directory of this distribution and at
> // http://rust-lang.org/COPYRIGHT.
> //
> // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
> // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
> // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
> // option. This file may not be copied, modified, or distributed
> // except according to those terms.
>
> // xfail-fast
> // This test had to do with an outdated version of the iterable trait.
> // However, the condition it was testing seemed complex enough to
> // warrant still having a test, so I inlined the old definitions.
>
> trait iterable<A> {
>     fn iter(&self, blk: &fn(A));
> }
>
> impl<A> iterable<A> for @fn(&fn(A)) {
>     fn iter(&self, blk: &fn(A)) { self(blk); }
> }
>
> impl iterable<uint> for @fn(&fn(uint)) {
>     fn iter(&self, blk: &fn(v: uint)) { self( |i| blk(i) ) }
> }
>
> fn filter<A,IA:iterable<A>>(self: IA, prd: @fn(A) -> bool, blk: &fn(A)) {
>     do self.iter |a| {
>         if prd(a) { blk(a) }
>     }
> }
>
> fn foldl<A,B,IA:iterable<A>>(self: IA, b0: B, blk: &fn(B, A) -> B) -> B {
>     let mut b = b0;
>     do self.iter |a| {
>         b = blk(b, a);
>     }
>     b
> }
>
> fn range(lo: uint, hi: uint, it: &fn(uint)) {
>     let mut i = lo;
>     while i < hi {
>         it(i);
>         i += 1u;
>     }
> }
>
> pub fn main() {
>     let range: @fn(&fn(uint)) = |a| range(0u, 1000u, a);
>     let filt: @fn(&fn(v: uint)) = |a| filter(
>         range,
>         |&&n: uint| n % 3u != 0u && n % 5u != 0u,
>         a);
>     let sum = foldl(filt, 0u, |accum, &&n: uint| accum + n );
>
>     io::println(fmt!("%u", sum));
> }
>
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
>
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to