When creating default values a trait method needs to be called with an
explicit trait name. `Default::default()` seems redundant. A free
function on the other hand, when imported directly, seems to be a better
API, as it is just `default()`. When implementing the trait, a method
is still required.
fn default() -> Self;
}
+/// Return the default value of a type according to the `Default` trait.
+///
+/// The type to return is inferred from context; this is equivalent to
+/// `Default::default()` but shorter to type.
+///
+/// For example:
+/// ```
+/// #![feature(default_free_fn)]
+///
+/// use std::default::default;
+///
+/// #[derive(Default)]
+/// struct AppConfig {
+/// foo: FooConfig,
+/// bar: BarConfig,
+/// }
+///
+/// #[derive(Default)]
+/// struct FooConfig {
+/// foo: i32,
+/// }
+///
+/// #[derive(Default)]
+/// struct BarConfig {
+/// bar: f32,
+/// baz: u8,
+/// }
+///
+/// fn main() {
+/// let options = AppConfig {
+/// foo: default(),
+/// bar: BarConfig {
+/// bar: 10.1,
+/// ..default()
+/// },
+/// };
+/// }
+/// ```
+#[unstable(feature = "default_free_fn", issue = "73014")]
+#[inline]
+pub fn default<T: Default>() -> T {
+ Default::default()
+}
+
/// Derive macro generating an impl of the trait `Default`.
#[rustc_builtin_macro]
#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
--> $DIR/issue-2356.rs:31:5
|
LL | default();
- | ^^^^^^^ help: try: `Self::default`
+ | ^^^^^^^
+ |
+help: try
+ |
+LL | Self::default();
+ | ^^^^^^^^^^^^^
+help: consider importing this function
+ |
+LL | use std::default::default;
+ |
error[E0425]: cannot find value `whiskers` in this scope
--> $DIR/issue-2356.rs:39:5