No one?

I understand that a part of the reason the RFC process is made so complex is 
that it filters out idiots like me. But I think this one is a pretty important 
design choice that Rust is about to get wrong.

On 2014-04-18, at 6:27, Tommi <rusty.ga...@icloud.com> wrote:

> Could someone please commit this RFC for me, thank you:
> 
> - Start Date: 2014-04-18
> - RFC PR #:
> - Rust Issue #:
> 
> # Summary
> 
> I propose the ability to set trait items (i.e. just methods currently) 
> private as well as public in order to expand the scope of possible use cases 
> of provided methods (i.e. default trait method implementations). I also 
> propose that trait items should be private by default.
> 
> # Motivation
> 
> Sometimes a trait may be able to provide a default implementation for a 
> method iff it can use a certain method which only the type that implements 
> the trait is in a position to provide a definition for. Often times such a 
> feedback method is supposed to be only a tool for the trait to be able to 
> define provided methods with, and as such, not supposed to become a part of 
> the public interface of the trait or any type which implements the trait. 
> Therefore such a feedback method should be made private. Trait items should 
> be private by default so that we don't have the need to reintroduce the 
> 'priv' keyword. If in future we get the ability to specify that a certain 
> provided method in a trait is 'final' (i.e. not overridable by the type which 
> implements the trait), then, together with private trait methods, we can use 
> the Non-Virtual Interface (NVI) idiom coined and described here by Herb 
> Sutter: http://www.gotw.ca/publications/mill18.htm
> 
> # Detailed design
> 
> One way of looking at private trait methods (or any private trait items) is 
> to see them as private dialog between a trait and a type which implements the 
> trait. This view could lead to a design where no-one else except the trait 
> and the type which implements it is allowed access to such private feedback 
> item. But given how Rust privacy rules work at module boundaries (and also 
> extend access to submodules), it would make sense that access to a private 
> trait item extended from just the trait or the type which implements it to 
> the enclosing module and its submodules. By this logic I suggest the 
> following privacy rules for private trait items:
> 
> Given that:  
> 1) A trait ```Tr``` specifies a private item ```priv_item``` and is defined 
> in module ```mod_tr```  
> 3) A type ```Foo``` implements ```Tr``` and is defined in module 
> ```mod_foo```  
> 3) A type ```Bar``` implements ```Tr``` and is defined in module 
> ```mod_bar_and_baz```  
> 4) A type ```Baz``` implements ```Tr``` and is defined in module 
> ```mod_bar_and_baz```
> 
> It follows that:  
> 1) ```priv_item``` is accessible from ```mod_tr``` and all its submodules.  
> 2) ```priv_item``` is accessible from ```mod_foo``` and all its submodules 
> iff it is certain at compile-time that it refers to the ```Foo```'s 
> implementation ```priv_item```  
> 3) ```priv_item``` is accessible from ```mod_bar_and_baz``` and all its 
> submodules iff it is certain at compile-time that it refers to either the 
> ```Bar```'s or ```Baz```'s implementation of ```priv_item```  
> 
> And ```priv_item``` is not accessible from anywhere else.
> 
> Example:
> ```
> // in mod_tr.rs
> pub trait Tr {
>    priv fn priv_item(&self);
> 
>    pub fn do_stuff(&self) {
>        self.priv_item(); // OK
>    }
> }
> 
> pub fn do_other_stuff<A:Tr>(a: &A) {
>    a.priv_item(); // OK
> }
> 
> // in mod_foo.rs
> use mod_tr::Tr;
> 
> pub struct Foo;
> 
> impl Tr for Foo {
>    priv fn priv_item(&self) {}
> }
> 
> pub fn do_foo_stuff(foo: &Foo) {
>    foo.priv_item(); // OK
> }
> 
> pub fn do_incorrect_stuff<A:Tr>(a: &A) {
>    a.priv_item(); // ERROR: "A private trait item Tr::priv_item not 
> accessible from mod_foo"
> }
> ```
> 
> # Alternatives
> 
> 
> 
> # Unresolved questions
> 
> 
> _______________________________________________
> Rust-dev mailing list
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev

_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to