Rollup merge of #64726 - andrewbanchich:unimplemented, r=rkruppe
rewrite documentation for unimplemented! to clarify use The current docs for `unimplemented!` seem to miss the point of this macro. > This can be useful if you are prototyping and are just looking to have your code type-check, or if you're implementing a trait that requires multiple methods, and you're only planning on using one of them. You could also return a `()` if you just want your code to type-check. I think `unimplemented!` is useful for when you want your program to exit when it reaches an unimplemented area. I rewrote the explanation and gave examples of both forms of this macro that I think clarify its use a little better.
This commit is contained in:
commit
2f0618d8c6
@ -520,18 +520,20 @@ macro_rules! unreachable {
|
||||
});
|
||||
}
|
||||
|
||||
/// Indicates unfinished code.
|
||||
/// Indicates unfinished code by panicking with a message of "not yet implemented".
|
||||
///
|
||||
/// This can be useful if you are prototyping and are just looking to have your
|
||||
/// code type-check, or if you're implementing a trait that requires multiple
|
||||
/// methods, and you're only planning on using one of them.
|
||||
/// This allows the your code to type-check, which is useful if you are prototyping or
|
||||
/// implementing a trait that requires multiple methods which you don't plan of using all of.
|
||||
///
|
||||
/// There is no difference between `unimplemented!` and `todo!` apart from the
|
||||
/// name.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// This will always [panic!](macro.panic.html)
|
||||
/// This will always [panic!](macro.panic.html) because `unimplemented!` is just a
|
||||
/// shorthand for `panic!` with a fixed, specific message.
|
||||
///
|
||||
/// Like `panic!`, this macro has a second form for displaying custom values.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -539,38 +541,53 @@ macro_rules! unreachable {
|
||||
///
|
||||
/// ```
|
||||
/// trait Foo {
|
||||
/// fn bar(&self);
|
||||
/// fn bar(&self) -> u8;
|
||||
/// fn baz(&self);
|
||||
/// fn qux(&self) -> Result<u64, ()>;
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// We want to implement `Foo` on one of our types, but we also want to work on
|
||||
/// just `bar()` first. In order for our code to compile, we need to implement
|
||||
/// `baz()`, so we can use `unimplemented!`:
|
||||
/// We want to implement `Foo` for 'MyStruct', but so far we only know how to
|
||||
/// implement the `bar()` function. `baz()` and `qux()` will still need to be defined
|
||||
/// in our implementation of `Foo`, but we can use `unimplemented!` in their definitions
|
||||
/// to allow our code to compile.
|
||||
///
|
||||
/// In the meantime, we want to have our program stop running once these
|
||||
/// unimplemented functions are reached.
|
||||
///
|
||||
/// ```
|
||||
/// # trait Foo {
|
||||
/// # fn bar(&self);
|
||||
/// # fn bar(&self) -> u8;
|
||||
/// # fn baz(&self);
|
||||
/// # fn qux(&self) -> Result<u64, ()>;
|
||||
/// # }
|
||||
/// struct MyStruct;
|
||||
///
|
||||
/// impl Foo for MyStruct {
|
||||
/// fn bar(&self) {
|
||||
/// // implementation goes here
|
||||
/// fn bar(&self) -> u8 {
|
||||
/// 1 + 1
|
||||
/// }
|
||||
///
|
||||
/// fn baz(&self) {
|
||||
/// // let's not worry about implementing baz() for now
|
||||
/// // We aren't sure how to even start writing baz yet,
|
||||
/// // so we have no logic here at all.
|
||||
/// // This will display "thread 'main' panicked at 'not yet implemented'".
|
||||
/// unimplemented!();
|
||||
/// }
|
||||
///
|
||||
/// fn qux(&self) -> Result<u64, ()> {
|
||||
/// let n = self.bar();
|
||||
/// // We have some logic here,
|
||||
/// // so we can use unimplemented! to display what we have so far.
|
||||
/// // This will display:
|
||||
/// // "thread 'main' panicked at 'not yet implemented: we need to divide by 2'".
|
||||
/// unimplemented!("we need to divide by {}", n);
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// let s = MyStruct;
|
||||
/// s.bar();
|
||||
///
|
||||
/// // we aren't even using baz() yet, so this is fine.
|
||||
/// }
|
||||
/// ```
|
||||
#[macro_export]
|
||||
|
Loading…
x
Reference in New Issue
Block a user