μ§κΈ format_args!
λ λ°νμ μ ArgumentV1::new(&runtime_data, Debug::fmt)
( {:?}
)λ₯Ό μ¬μ©ν©λλ€. λ°νμ μ λ¨ νλκ° μλ μΈμλΉ μ΅λ λ κ°μ ν¬μΈν°λ₯Ό μ¬μ©ν©λλ€( &runtime_data
). .
allow_internal_unsafe
λ° #44240μ μ¬μ©νλ©΄ (rvalue-promoted) 'static
λ°μ΄ν°μ (μ: Debug::fmt
) fn
ν¬μΈν°λ₯Ό λ°°μΉν μ μμ΅λλ€. λλ¨Έμ§ μ₯μ λ¬Όμ λ°νμ λ°μ΄ν°μ μ νμ μ μΆν©λλ€.
μ¦, Debug::fmt
λ μ€μ λ‘ <_ as Debug>::fmt
μ΄κ³ ArgumentV1::new
μ μλͺ
μ΄ ν¨κ» μ
λ ₯λμκΈ° λλ¬Έμ _
κ° λ°λ‘ μ§κΈ μ μΆλ©λλ€. κ·Έλ€μ΄ λΆλ¦¬λμ΄ μλ€λ©΄ μ°λ¦¬λ μλ‘μ΄ κ²μ΄ νμν©λλ€.
HList
ν¨ν΄( struct HCons<H, T>(H, T); struct HNil;
- A
, B
λ° C
μ νμ 3κ° μμμ λν΄ HCons<A, HCons<B, HCons<C, HNil>>>
), #[repr(C)]
μ ν¨κ» μ¬μ©νλ©΄ λ°°μ΄μ λ μ΄μμκ³Ό μΌμΉνλ κ²°μ μ λ μ΄μμ, μ¦ λ€μ λ κ°μ§κ° μ 곡λ©λλ€.
&'static HCons<fn(&A), HCons<fn(&B), HCons<fn(&C), HNil>>>
&'static [unsafe fn(*const Opaque); 3]
λμΌν ννμ κ°μ§λ©° νμλ μ¬λΌμ΄μ€λ‘ ν¬κΈ°λ₯Ό μ‘°μ ν μ μμ΅λλ€. HList
μμ λ°°μ΄(κ·Έλ¦¬κ³ μ¬λΌμ΄μ€)λ‘μ μ΄ λ³νμ fn
ν¬μΈν°λ₯Ό μ΄λνλ λ° νμν μμ ν rvalue μΉκ²© HCons
μμμ μνν μ μμ΅λλ€. 'static
λ°μ΄ν°λ‘ λ³νν©λλ€.
μΆλ‘ μ μν΄ μ νμ μΌμΉμν€λ λͺ κ°μ§ ν¨μ νΈμΆμ μ½μ
ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ B
λ₯Ό μΆλ‘ νκΈ° μν΄ fmt::unify_fn_with_data((list.1).0, &b)
λ₯Ό μννλ©΄ B
λ₯Ό typeof b
.
HList
μ ν¬λ§·ν°μ HList
μ λ°νμ μ°Έμ‘°λ₯Ό κ²°ν©νμ¬ μ νμ ν΅ν©νλ μμ ν μμ ν "λΉλ" μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²μ΄ μ€μ λ‘ λ κ°λ¨ν μ μμ§λ§ μ λ μ½κ° κ±±μ μ΄ λ©λλ€. λͺ¨λ νΈλ μ λμ€ν¨μΉλ‘ μΈν μ»΄νμΌ μκ° - μ΄λ€ κ²½μ°λ μν₯μ μΈ‘μ ν΄μΌ ν©λλ€.
@rustbot μ£Όμ₯
μΆλ‘ μ μν΄ μ νμ μΌμΉμν€λ λͺ κ°μ§ ν¨μ νΈμΆμ μ½μ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄
B
λ₯Ό μΆλ‘ νκΈ° μν΄fmt::unify_fn_with_data((list.1).0, &b)
λ₯Ό μννλ©΄B
λ₯Όtypeof b
.
λ΄κ° κ±°κΈ°μμ 무μμ μκ°νκ³ μμλμ§ νμ€νμ§ μλ€, κ·Έκ²μ κ·Έκ²λ³΄λ€ ν¨μ¬ μ¬μΈ κ²μ΄λ€!
struct ArgMetadata<T: ?Sized> {
// Only `unsafe` because of the later cast we do from `T` to `Opaque`.
fmt: unsafe fn(&T, &mut Formatter<'_>) -> Result,
// ... flags, constant string fragments, etc.
}
// TODO: maybe name this something else to emphasize repr(C)?
#[repr(C)]
struct HCons<T, Rest>(T, Rest);
// This would have to be in a "sealed module" to make it impossible to implement on more types.
trait MetadataFor<D> {
const LEN: usize;
}
impl MetadataFor<()> for () {
const LEN: usize = 0;
}
impl<'a, T: ?Sized, D, M> MetadataFor<HCons<&'a T, D>> for HCons<ArgMetadata<T>, M>
where M: MetadataFor<D>
{
const LEN: usize = M::LEN;
}
impl<'a> Arguments<'a> {
fn new<M, D>(meta: &'a M, data: &'a D) -> Self
where M: MetadataFor<D>
{
Self {
meta: unsafe { &*(meta as *const _ as *const [ArgMetadata<Opaque>; M::LEN]) },
data: unsafe { &*(data as *const _ as *const [&Opaque; M::LEN]) },
}
}
}
μ¦, νλλ μμ ν μΌμ ν λ©νλ°μ΄ν°λ₯Ό μ¬μ©νκ³ λ€λ₯Έ νλλ λ°νμ λ°μ΄ν°μ λν μ°Έμ‘°λ₯Ό μ¬μ©νμ¬ "λ³λ ¬λ‘" λ κ°μ HList
λΉλνλ©΄ λͺ¨λ μ ν μΆλ‘ μ΄ where
μμ μ¬ μ μμ΅λλ€. fmt::Arguments::new
μ λν μ , codegen cruftκ° 0μ
λλ€ !
νΈμ§ : @m-ou-seλ λ΄κ° μ²μμ λͺ
μμ μΆλ‘ νΈλ¦μ μ¬μ©ν μ΄μ λ₯Ό μκΈ°μμΌ μ£Όμ΄μΌ νμ΅λλ€. μμ μ‘μΈμ€ μΈμ: μ€λ§:
(μΆ©λΆν const μ λ€λ¦ ab μ¬μ©μΌλ‘ D: IndexHList<i, Output = T>
κ°μ§ μ μμ§λ§ λ§μ λ
Έλ ₯μ΄ νμν©λλ€)
λ¬Έμμ΄ μ‘°κ°κ³Ό λͺ¨λ νμ μ§μ μ΅μ
(μλ κ²½μ°)μ λͺ¨λ ν¬ν¨νλ 'μ μ λ©νλ°μ΄ν°'μ μλ‘μ΄ νμμ μ¬μ©νμ¬ ν¬κΈ°κ° λ ν¬μΈν°μ λΆκ³Όν fmt::Arguments
μ μλ‘μ΄ κ΅¬νμ΄ μμ΅λλ€. (λ°λΌμ μ΄μ λ μ§μ€ν° μμ λ§μ΅λλ€. μ λ§ μ’μ΅λλ€.) λν @eddyb κ° μ΄ λ¬Έμ μμ 3λ
μ μ μ΄λ―Έ μ μν κ²μ²λΌ μΈμλΉ μ€νμ λν ν¬μΈν°κ° λ κ° λμ νλλ§ νμν©λλ€. ^^ (μ΄μ @eddybκ° μ§μ νκΈ° μ κΉμ§ μ΄ λ¬Έμ λ₯Ό μμ ν λμ³€μ΅λλ€. ^^')
μ¬μ ν λ¨μ μλ κ²μ format_args!()
λ₯Ό μ
λ°μ΄νΈνμ¬ μ΄ μλ‘μ΄ μ νμ λμ μμ±νλ κ²μ
λλ€. κ·Έλ¬λ©΄ κ°μ²΄ ν¬μΈν°μ ν¨μ ν¬μΈν°(νμ¬ ArgumentV1
ν¨κ» μμ)λ₯Ό ν¨μ ν¬μΈν°λ‘ λΆν νλ λ¬Έμ κ° λ°μν©λλ€. μ΄μ 'μ μ λ©νλ°μ΄ν°'λ‘ μ΄λν΄μΌ ν©λλ€. μ΄ λ¬Έμ μ μ μμ κ·Έλ κ² νλ μ’μ λ°©λ²μΈ κ² κ°μ΅λλ€. 곧 ꡬννλ €κ³ ν©λλ€. νΌν¬λ¨Όμ€ λ°μ΄ κΈ°λλ©λλ€ :)
κ°μ₯ μ μ©ν λκΈ
λ΄κ° κ±°κΈ°μμ 무μμ μκ°νκ³ μμλμ§ νμ€νμ§ μλ€, κ·Έκ²μ κ·Έκ²λ³΄λ€ ν¨μ¬ μ¬μΈ κ²μ΄λ€!
μ¦, νλλ μμ ν μΌμ ν λ©νλ°μ΄ν°λ₯Ό μ¬μ©νκ³ λ€λ₯Έ νλλ λ°νμ λ°μ΄ν°μ λν μ°Έμ‘°λ₯Ό μ¬μ©νμ¬ "λ³λ ¬λ‘" λ κ°μ
HList
λΉλνλ©΄ λͺ¨λ μ ν μΆλ‘ μ΄where
μμ μ¬ μ μμ΅λλ€.fmt::Arguments::new
μ λν μ , codegen cruftκ° 0μ λλ€ !νΈμ§ : @m-ou-seλ λ΄κ° μ²μμ λͺ μμ μΆλ‘ νΈλ¦μ μ¬μ©ν μ΄μ λ₯Ό μκΈ°μμΌ μ£Όμ΄μΌ νμ΅λλ€. μμ μ‘μΈμ€ μΈμ: μ€λ§:
(μΆ©λΆν const μ λ€λ¦
abμ¬μ©μΌλ‘D: IndexHList<i, Output = T>
κ°μ§ μ μμ§λ§ λ§μ λ Έλ ₯μ΄ νμν©λλ€)