# Implement trait for external structures use one statement block

**URL:** <https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888>\
**Category:** language design\
**Created:** [December 1, 2022, 6:01am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888 "2022-12-01T06:01:08Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![tu6ge](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/tu6ge/32/10222_2.png) [@tu6ge](https://internals.rust-lang.org/u/tu6ge)\
**Post date:** [December 1, 2022, 6:01am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/1 "2022-12-01T06:01:09Z")

</div>

Sometime, we want to Implement some method with other mod struct, it need write two statement block:

```rust
mod block1{
    pub structA;
}

mod block2{
    use super::block1::structA;
    trait MyTrait {
       fn foo(self);
    }

    impl MyTrait for structA {
        fn foo(self){
            println!("this is foo method");
        }
    }
}

```

I think it can be integrated into this way:

```rust
mod block1{
    pub structA;
}

mod block2{
    use super::block1::structA;

    trait MyTrait for structA {
        fn foo(self){
            println!("this is foo method");
        }
    }

    pub trait MyTrait2 for structA {
        fn foo2(self){
            println!("this is foo method");
        }
    }
}

```

Is there any problem in doing this?

---

<div class="post-metadata">

**Author:** ![jhpratt](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/jhpratt/32/11640_2.png) [@jhpratt](https://internals.rust-lang.org/u/jhpratt)\
**Post date:** [December 1, 2022, 6:16am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/2 "2022-12-01T06:16:46Z")

</div>

What exactly are you asking?

---

<div class="post-metadata">

**Author:** ![steffahn](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/steffahn/32/13288_2.png) [@steffahn](https://internals.rust-lang.org/u/steffahn)\
**Post date:** [December 1, 2022, 6:27am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/3 "2022-12-01T06:27:09Z")

</div>

For declaring a trait and implementing it for only a single type at the same time, as commonly done in the “extension trait” pattern, you can reduce the boilerplate slightly by using a macro. E. g. this crate provides one: [extension\_trait in extension\_trait - Rust](https://docs.rs/extension-trait/1.0.1/extension_trait/attr.extension_trait.html)

In your example where it's merely different modules, note that inherent `impl StructA` blocks will still work as long as it's the same crate; but maybe you were simply using models as a stand-in for crates in your example code.

---

<div class="post-metadata">

**Author:** ![tu6ge](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/tu6ge/32/10222_2.png) [@tu6ge](https://internals.rust-lang.org/u/tu6ge)\
**Post date:** [December 1, 2022, 6:27am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/4 "2022-12-01T06:27:19Z")

</div>

Maybe I didn't make it clear. I think it's a good idea to combine two statements into one statement

---

<div class="post-metadata">

**Author:** ![tu6ge](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/tu6ge/32/10222_2.png) [@tu6ge](https://internals.rust-lang.org/u/tu6ge)\
**Post date:** [December 1, 2022, 6:38am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/5 "2022-12-01T06:38:45Z")

</div>

I searched for him on crates, but I can't understand why he is called by such a name

---

<div class="post-metadata">

**Author:** ![jhpratt](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/jhpratt/32/11640_2.png) [@jhpratt](https://internals.rust-lang.org/u/jhpratt)\
**Post date:** [December 1, 2022, 7:11am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/6 "2022-12-01T07:11:44Z")

</div>

How does your example do that? It's very unclear what you're proposing.

---

<div class="post-metadata">

**Author:** ![tu6ge](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/tu6ge/32/10222_2.png) [@tu6ge](https://internals.rust-lang.org/u/tu6ge)\
**Post date:** [December 1, 2022, 8:33am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/7 "2022-12-01T08:33:29Z")

</div>

The example is my expect syntax , or find a suitable macro package

---

<div class="post-metadata">

**Author:** ![system](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/system/32/14092_2.png) [@system](https://internals.rust-lang.org/u/system)\
**Post date:** [March 1, 2023, 8:34am UTC](https://internals.rust-lang.org/t/implement-trait-for-external-structures-use-one-statement-block/17888/8 "2023-03-01T08:34:27Z")

</div>

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.
