Rollup merge of #42122 - rust-lang:frewsxcv/unstable-book, r=steveklabnik
Add a few entries to the Unstable Book.
This commit is contained in:
commit
7a7e236076
@ -6,5 +6,25 @@ The tracking issue for this feature is: [#34981]
|
||||
|
||||
------------------------
|
||||
|
||||
At present, literals are only accepted as the value of a key-value pair in
|
||||
attributes. What's more, only _string_ literals are accepted. This means that
|
||||
literals can only appear in forms of `#[attr(name = "value")]` or
|
||||
`#[attr = "value"]`.
|
||||
|
||||
The `attr_literals` unstable feature allows other types of literals to be used
|
||||
in attributes. Here are some examples of attributes that can now be used with
|
||||
this feature enabled:
|
||||
|
||||
+```rust,ignore
|
||||
+#[attr]
|
||||
+#[attr(true)]
|
||||
+#[attr(ident)]
|
||||
+#[attr(ident, 100, true, "true", ident = 100, ident = "hello", ident(100))]
|
||||
+#[attr(100)]
|
||||
+#[attr(enabled = true)]
|
||||
+#[enabled(true)]
|
||||
+#[attr("hello")]
|
||||
+#[repr(C, align = 4)]
|
||||
+#[repr(C, align(4))]
|
||||
+```
|
||||
|
||||
|
@ -5,3 +5,26 @@ The tracking issue for this feature is: [#31436]
|
||||
[#31436]: https://github.com/rust-lang/rust/issues/31436
|
||||
|
||||
------------------------
|
||||
|
||||
The `catch_expr` feature adds support for a `catch` expression. The `catch`
|
||||
expression creates a new scope one can use the `?` operator in.
|
||||
|
||||
```rust
|
||||
#![feature(catch_expr)]
|
||||
|
||||
use std::num::ParseIntError;
|
||||
|
||||
let result: Result<i32, ParseIntError> = do catch {
|
||||
Ok("1".parse::<i32>()?
|
||||
+ "2".parse::<i32>()?
|
||||
+ "3".parse::<i32>()?)
|
||||
};
|
||||
assert_eq!(result, Ok(6));
|
||||
|
||||
let result: Result<i32, ParseIntError> = do catch {
|
||||
Ok("1".parse::<i32>()?
|
||||
+ "foo".parse::<i32>()?
|
||||
+ "3".parse::<i32>()?)
|
||||
};
|
||||
assert!(result.is_err());
|
||||
```
|
||||
|
@ -6,5 +6,42 @@ The tracking issue for this feature is: [#29628]
|
||||
|
||||
------------------------
|
||||
|
||||
The `on_unimplemented` feature provides the `#[rustc_on_unimplemented]`
|
||||
attribute, which allows trait definitions to add specialized notes to error
|
||||
messages when an implementation was expected but not found.
|
||||
|
||||
For example:
|
||||
|
||||
```rust,compile_fail
|
||||
#![feature(on_unimplemented)]
|
||||
|
||||
#[rustc_on_unimplemented="a collection of type `{Self}` cannot be built from an \
|
||||
iterator over elements of type `{A}`"]
|
||||
trait MyIterator<A> {
|
||||
fn next(&mut self) -> A;
|
||||
}
|
||||
|
||||
fn iterate_chars<I: MyIterator<char>>(i: I) {
|
||||
// ...
|
||||
}
|
||||
|
||||
fn main() {
|
||||
iterate_chars(&[1, 2, 3][..]);
|
||||
}
|
||||
```
|
||||
|
||||
When the user compiles this, they will see the following;
|
||||
|
||||
```txt
|
||||
error[E0277]: the trait bound `&[{integer}]: MyIterator<char>` is not satisfied
|
||||
--> <anon>:14:5
|
||||
|
|
||||
14 | iterate_chars(&[1, 2, 3][..]);
|
||||
| ^^^^^^^^^^^^^ the trait `MyIterator<char>` is not implemented for `&[{integer}]`
|
||||
|
|
||||
= note: a collection of type `&[{integer}]` cannot be built from an iterator over elements of type `char`
|
||||
= note: required by `iterate_chars`
|
||||
|
||||
error: aborting due to previous error
|
||||
```
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user