Add some more documentation to SystemParam (#4787)
				
					
				
			# Objective - Fixes https://github.com/bevyengine/bevy/issues/4783 ## Solution - Add more documentation about the derive, and the obscure failure case for this. - Link to [`StaticSystemParam`](https://docs.rs/bevy/latest/bevy/ecs/system/struct.StaticSystemParam.html) in these docs. - Also explain the attributes whilst here.
This commit is contained in:
		
							parent
							
								
									ae0cb549ff
								
							
						
					
					
						commit
						7da21b12f7
					
				| @ -25,8 +25,27 @@ use std::{ | |||||||
| ///
 | ///
 | ||||||
| /// # Derive
 | /// # Derive
 | ||||||
| ///
 | ///
 | ||||||
| /// This trait can be derived with the [`derive@super::SystemParam`] macro. The only requirement
 | /// This trait can be derived with the [`derive@super::SystemParam`] macro.
 | ||||||
| /// is that every struct field must also implement `SystemParam`.
 | /// This macro only works if each field on the derived struct implements [`SystemParam`].
 | ||||||
|  | /// Note: There are additional requirements on the field types.
 | ||||||
|  | /// See the *Generic `SystemParam`s* section for details and workarounds of the probable
 | ||||||
|  | /// cause if this derive causes an error to be emitted.
 | ||||||
|  | ///
 | ||||||
|  | ///
 | ||||||
|  | /// The struct for which `SystemParam` is derived must (currently) have exactly
 | ||||||
|  | /// two lifetime parameters.
 | ||||||
|  | /// The first is the lifetime of the world, and the second the lifetime
 | ||||||
|  | /// of the parameter's state.
 | ||||||
|  | ///
 | ||||||
|  | /// ## Attributes
 | ||||||
|  | ///
 | ||||||
|  | /// `#[system_param(ignore)]`:
 | ||||||
|  | /// Can be added to any field in the struct. Fields decorated with this attribute
 | ||||||
|  | /// will created with the default value upon realisation.
 | ||||||
|  | /// This is most useful for `PhantomData` fields, to ensure that the required lifetimes are
 | ||||||
|  | /// used, as shown in the example.
 | ||||||
|  | ///
 | ||||||
|  | /// # Example
 | ||||||
| ///
 | ///
 | ||||||
| /// ```
 | /// ```
 | ||||||
| /// # use bevy_ecs::prelude::*;
 | /// # use bevy_ecs::prelude::*;
 | ||||||
| @ -46,6 +65,30 @@ use std::{ | |||||||
| ///
 | ///
 | ||||||
| /// # bevy_ecs::system::assert_is_system(my_system);
 | /// # bevy_ecs::system::assert_is_system(my_system);
 | ||||||
| /// ```
 | /// ```
 | ||||||
|  | ///
 | ||||||
|  | /// # Generic `SystemParam`s
 | ||||||
|  | ///
 | ||||||
|  | /// When using the derive macro, you may see an error in the form of:
 | ||||||
|  | ///
 | ||||||
|  | /// ```text
 | ||||||
|  | /// expected ... [ParamType]
 | ||||||
|  | /// found associated type `<<[ParamType] as SystemParam>::Fetch as SystemParamFetch<'_, '_>>::Item`
 | ||||||
|  | /// ```
 | ||||||
|  | /// where `[ParamType]` is the type of one of your fields.
 | ||||||
|  | /// To solve this error, you can wrap the field of type `[ParamType]` with [`StaticSystemParam`]
 | ||||||
|  | /// (i.e. `StaticSystemParam<[ParamType]>`).
 | ||||||
|  | ///
 | ||||||
|  | /// ## Details
 | ||||||
|  | ///
 | ||||||
|  | /// The derive macro requires that the [`SystemParam`] implementation of
 | ||||||
|  | /// each field `F`'s [`Fetch`](`SystemParam::Fetch`)'s [`Item`](`SystemParamFetch::Item`) is itself `F`
 | ||||||
|  | /// (ignoring lifetimes for simplicity).
 | ||||||
|  | /// This assumption is due to type inference reasons, so that the derived [`SystemParam`] can be
 | ||||||
|  | /// used as an argument to a function system.
 | ||||||
|  | /// If the compiler cannot validate this property for `[ParamType]`, it will error in the form shown above.
 | ||||||
|  | ///
 | ||||||
|  | /// This will most commonly occur when working with `SystemParam`s generically, as the requirement
 | ||||||
|  | /// has not been proven to the compiler.
 | ||||||
| pub trait SystemParam: Sized { | pub trait SystemParam: Sized { | ||||||
|     type Fetch: for<'w, 's> SystemParamFetch<'w, 's>; |     type Fetch: for<'w, 's> SystemParamFetch<'w, 's>; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel McNab
						Daniel McNab