https://github.com/rust-lang/rfcs/pull/1961 . рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛
рдпрд╣рд╛рдВ рдкреАрдЖрд░: #44097 #58710
рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░: https://github.com/rust-lang/rust/pull/77872
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдЗрд╕рдиреЗ рд╕рд░реНрд╡реЛ рдФрд░ рдкрд╛рдердлрд╛рдЗрдВрдбрд░ рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ред
cc @rust-lang/libs, рдпрд╣ min
/ max
рд╕рдорд╛рди рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА clamp
рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдкреИрджрд╛ рд╣реБрдИ рд╣реИред . рдпрд╣ рдкреНрд░рддрд┐ рд╕реЗрд╡рд░ рдиреАрддрд┐ рдХреЗ рдЯреВрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рджрд░реНрдж рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рд╣реИред
рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ рдЯреНрд░рд╛рдЗрдПрдЬ рдмреИрдардХ рдХреЗ рд▓рд┐рдП рдирд╛рдорд╛рдВрдХрдиред
рдЗрд╕ рдмреАрдЪ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?
рдореИрдВ рдЗрд╕ рдкрд░ @bluss рдХреЗ рд╕рд╛рде
restrict
clamp_to_range
min_max
(рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рддрд░рд╣ рд╣реИред)
рдпреЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ clamp
рдХрд╛ рдкреНрд░рднрд╛рд╡ рдХрд┐рддрдирд╛ рдмреБрд░рд╛ рд╣реИ? clamp
рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдкреАрдЖрд░ рдХреЛ рддреБрд░рдВрдд рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреНрд░реЗрдЯрд░ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред @Xaeroxe , рдЙрд╕рдХреЗ рд▓рд┐рдП?
рдЬрд╝рд░реВрд░ред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрднреА рдХреНрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реВрдВред
@Xaeroxe рдЖрд╣ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдкреАрдЖрд░ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ред (рдореИрдВ рдЖрдЬ рдЫреБрдЯреНрдЯреА рдкрд░ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд╛рдо рдкрд░ рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @BurntSushi рдпрд╛ @alexcrichton рдЬреИрд╕реЗ libs рдкрд░ рдХрд┐рд╕реА рдФрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред
рдореИрдВ рдЕрднреА рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрдкрдиреА рдЫреБрдЯреНрдЯреА рдкрд░ рдордЬрд╝реЗ рдХрд░реЛ!
рдкреАрдЖрд░ рддреИрдпрд╛рд░ https://github.com/rust-lang/rust/pull/44438
рдХреНрдпрд╛ clamp_to_range(min, max)
clamp_to_min(min)
рдФрд░ clamp_to_max(max)
(рдЕрддрд┐рд░рд┐рдХреНрдд рджрд╛рд╡реЗ рдХреЗ рд╕рд╛рде рдХрд┐ min <= max
) рд╕реЗ рдмрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдПрдХ RFC рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ 6 рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдЯреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ 4 рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рддрд░рд╣ рд╕реЗ рдШрд┐рд╕рд╛ рд╣реБрдЖ рд╣реВрдВред рд╡рд╣реА рдлрд╝рдВрдХреНрд╢рди 2 рджрд┐рдиреЛрдВ рдореЗрдВ num рдореЗрдВ рд╡рд┐рд▓реАрди рд╣реЛ рдЧрдпрд╛ рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдПрд╕рдЯреАрдбреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдФрд░ 6 рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реВрдВред
рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ @aturon рдХрд╛ рдкрд┐рдЫрд▓рд╛ рдирд╛рдорд╛рдВрдХрди рдЕрдм рднреА рджрд┐рдЦрд╛рдИ рджреЗ.
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдЗрд╕реЗ рд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдордп рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рд╢реБрд░реВ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдпрд╣ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЯреВрдЯ-рдлреВрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ ord_max_min
рдЬрд┐рд╕рдиреЗ рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рддреЛрдбрд╝ рджрд┐рдпрд╛:
рдФрд░ рдЙрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдереА "рдлрд╝рдВрдХреНрд╢рди Ord::min
рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ [...] libs рдЯреАрдо рдиреЗ рдЖрдЬ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЯреВрдЯрдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ"ред рдФрд░ рд╡рд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ TMTOWTDI рд╕реБрд╡рд┐рдзрд╛ рдереА, рдЬрдмрдХрд┐ clamp
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрд▓рдЧ рд░реВрдк рдХреЗ рддрд╣рдд рдПрд╕рдЯреАрдбреА рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛ред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП, рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд░реВрдк рд╕реЗ, рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рдЖрд░рдПрдлрд╕реА рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ "рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ Iterator
рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдПрд╕рдЯреАрдбреА рдореЗрдВ рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рдирдП рддрд░реАрдХреЗ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ"ред
рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рднреА рдирдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП "рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛" рдереАред рдЕрдм рдПрд╕рдЯреАрдбреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рддрдм рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирдИ рд╡рд┐рдзрд┐ рдЕрднреА рднреА рдПрдХ рдлреАрдЪрд░ рдлреНрд▓реИрдЧ рдХреЗ рдкреАрдЫреЗ рд╣реИред рд╕рдВрдХрд▓рдХ рддрдм рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд╡рд┐рдзрд┐ рдПрдХ рдлреАрдЪрд░ рдзреНрд╡рдЬ рдХреЗ рдкреАрдЫреЗ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд┐рд░ рдЯреВрд▓рдЪреЗрди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕рдВрдХрд▓рдХ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдЪреБрдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдерд┐рд░ рд╕рдВрдХрд▓рдХ рдкрд░ рдЯреВрдЯ-рдлреВрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ: рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрдердб рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдХрд╣реАрдВ рднреА рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред
(рдореЗрдЯрд╛) рдмрд╕ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдпрд╣рд╛рдВ
рдЕрдЧрд░ рд╣рдо рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ #44438 рдЙрдЪрд┐рдд рд╣реИ,
рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд╛рд░рдВрдЯреА-рдкреНрд░рдХрд╛рд░-рдЕрдиреБрдорд╛рди-рдЯреВрдЯрдирд╛ рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ XIB рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ RFCs 1105 рдФрд░ 1122 рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ UFCS рдпрд╛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдореБрджрд╛рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #42496 ( Ord::{min, max}
) рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯреВрдЯ-рдлреВрдЯ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, #41336 ( T += &T
рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕) 8 рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдкреНрд░рддрд┐рдЧрдорди рдХреЗ рдХрд╛рд░рдг "рдмрд╕" рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЬрдм рднреА рд╣рдо рдХреЛрдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдбреНрдврд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдирд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЕрдиреБрдорд╛рди рд╡рд┐рдлрд▓рддрд╛ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ - #41793 рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ {f32, f64}::from_bits
, рдЬреЛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ ieee754::Ieee754::from_bits
рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реИред
рдЬрдм рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреНрд░реЗрдЯ рдиреЗ #![feature(clamp)]
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ рдЙрдореНрдореАрджрд╡рд╛рд░ Ord::clamp
рдХрднреА рднреА рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдиреБрдХреВрд▓ рдЪреЗрддрд╛рд╡рдиреА рдЕрднреА рднреА рдЬрд╛рд░реА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ) рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдорд╛рдзрд╛рди рди рд╣реЛред рдпрд╣ "рдЗрдВрд╕реНрдЯрд╛-рдмреНрд░реЗрдХрд┐рдВрдЧ" рдирд╣реАрдВ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╢реБрд░реВрдЖрдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрд╣реБрдд рдмреБрд░реА рдЬрдЧрд╣ рдкрд░ рд╣реИрдВ рдпрджрд┐ рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЪрд╛рд╣рддреЗ рдереЗ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдзрд┐рдХрддрдо/рдорд┐рдирдЯ рдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд╛рди рдорд╛рд░рд╛ред рдЗрд╕реЗ рдХреНрд▓реИрдВрдк рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЕрднреА рднреА рд╣рд╛рдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди @sfackler рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╣рдореЗрдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рд╣рдо рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреАрдЖрдИ рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдореМрдЬреВрджрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЦрд░реАрджреЗ рдЧрдП рд╣реИрдВред
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЖрдиреЗ рдХреЗ рд╕рд╛рде рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдбрд╛рд▓рдХрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрддреЗ рд╣реИрдВред
рдПрдХ рдХрд╖реНрдЯрдкреНрд░рдж рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдирдИ рдПрд╕рдЯреАрдбреА рд╡рд┐рдзрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддреА рд╣реИ: рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд╕реНрдерд┐рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рд╕рдВрдШрд░реНрд╖ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╕рдорд╛рди рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рджреЗрдирд╛ рдПрдХ рдмреБрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреА рднрд╡рд┐рд╖реНрдп рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ рдмрдХреНрд╕реЗ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рд░рд╛рдд рдореЗрдВ рдЪрдпрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореБрдЭреЗ рдХреБрдЫ рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЪрд┐рдВрддрд╛ рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИрдВред
рдпреМрдЧрд┐рдХ рдкреНрд░рдХрд╛рд░
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ BtreeSet<BtreeSet<impl Ord>>::range
рдЬрд┐рддрдирд╛ рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рдорджрджрдЧрд╛рд░ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ Vec<char>
ред
рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓рд┐рдВрдЧ рдореЛрдб
рдЬрдм рдпрд╣ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдЖрдпрд╛, рддреЛ рдЬрд╡рд╛рдм рд╕рд┐рд░реНрдл рдЧрд╛рдп рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдерд╛ред
рдмреЗрд╢рдХ, рднрдВрдбрд╛рд░рдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
fn clamp<T>(mut self, low: &T, high: &T) -> Self
where T: ?Sized + ToOwned<Owned=Self> + Ord, Self : Borrow<T>
{
assert!(low <= high);
if self.borrow() < &low {
low.clone_into(&mut self);
} else if self.borrow() >= &high {
high.clone_into(&mut self);
}
self
}
рдХреМрди рд╕рд╛ https://github.com/rust-lang/rfcs/pull/2111 рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рдЯреНрд░рд╛рдЗрдПрдЬ рдХреЗ рджреМрд░рд╛рди рд▓рд┐рдмреНрд╕ рдЯреАрдо рдиреЗ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╣ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЗрдЯрд░ рд░рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдХреНрдпрд╛ рджрд░рд╛рд░ рд╣реИред рдЙрд╕реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рддрдп рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреНрдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рднрд╡рд┐рд╖реНрдп рдХреА рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкрд┐рд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдореНрди-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рд▓рдХреНрд╖рдг рдпрд╛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рдЧрддрд┐ рдкрд░ рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрднреА рдХреНрд░реЗрдЯрд░ рд░рди рд╣реБрдЖ?
#48552 рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рдмрд╛рдж рдореЗрд░реА рдпреЛрдЬрдирд╛ clamp()
рдкрджреНрдзрддрд┐ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ RangeInclusive
рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд░реЗрдВрдЬ-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдХрд▓реНрдк рдЕрдм рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рд▓реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ ..=
рдЗрддрдирд╛ рдЕрд╕реНрдерд┐рд░ рдерд╛ ЁЯШД):
// Current
trait Ord {
fn clamp(self, min: Self, max: Self) -> Self { ... }
}
assert_eq!(9.clamp(6, 7), 7);
// Alternative
trait Ord {
fn clamp(self, range: RangeInclusive<Self>) -> Self { ... }
}
assert_eq!(9.clamp(6..=7), 7);
рдПрдХ рд╕реНрдерд┐рд░ RangeInclusive
рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рднреА рдЦреЛрд▓рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рдЗрдзрд░-рдЙрдзрд░ рдХрд░рдирд╛ (рдЬреЛ рдСрдЯреЛрд░реЗрдл рдХреЗ рд╕рд╛рде рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд╛рдо рдЯрдХрд░рд╛рд╡ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ):
impl<T: Ord + Clone> RangeInclusive<T> {
fn clamp(&self, mut x: T) -> T {
if x < self.start { x.clone_from(&self.start); }
else if x > self.end { x.clone_from(&self.end); }
x
}
}
assert_eq!((1..=10).clamp(11), 10);
let strings = String::from("aa")..=String::from("b");
assert_eq!(strings.clamp(String::from("a")), "aa");
assert_eq!(strings.clamp(String::from("aaa")), "aaa");
https://play.rust-lang.org/?gist=38def79ba2f3f8380197918377dc66f5&version=nightly
рдореИрдВрдиреЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ ...
рдпрджрд┐ рд░реЗрдВрдЬ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЖрдирдВрдж рд▓реВрдВрдЧрд╛, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ?
рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдо рд╕рд╣рдорддрд┐ рд╣реИ, рдХрд┐ рд░реЗрдВрдЬ рдЗрдиреНрдХреНрд▓реВрд╕рд┐рд╡ рдореЗрдВ рдХреНрд▓реИрдВрдк рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рддреЛ рдХрд┐рд╕реА рдХреЛ рдЖрд░рдПрдлрд╕реА рд▓рд┐рдЦрдирд╛ рд╣реИ?
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╢рд╛рдпрдж рдПрдХ рдкреВрд░реНрдг RFC рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рдПрдХ рдирд┐рд░реНрдгрдп рдЬреЛ рд╡рд░реНрддрдиреА рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ:
value.clamp(min, max)
(рдЖрд░рдПрдлрд╕реА рдХрд╛ рдпрдерд╛рд╡рдд рдкрд╛рд▓рди рдХрд░реЗрдВ)value.clamp(min..=max)
(min..=max).clamp(value)
рд╡рд┐рдХрд▓реНрдк 2 рдпрд╛ 3 рдЖрд╕рд╛рди рдЖрдВрд╢рд┐рдХ рдХреНрд▓реИрдВрдкрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рддреБрдо рдХрд░ рд╕рдХрддреЗ рд╣реЛ value.clamp(min..)
рдпрд╛ value.clamp(..=max)
, рдмрд┐рдирд╛ рд╡рд┐рд╢реЗрд╖ рдХреА рдЬрд░реВрд░рдд clamp_to_start
рдпрд╛ clamp_to_end
рддрд░реАрдХреЛрдВред
@egilburg : рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ: clamp_to_start
max
рдФрд░ clamp_to_end
min
: рдкрд▓рдХ:
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдЧрддрд┐ рдЕрдЪреНрдЫреА рд╣реИред
@egilburg Rust рдкреНрд░рддреНрдпрдХреНрд╖ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк 2 рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ RangeInclusive
, RangeToInclusive
рдФрд░ RangeFrom
рд▓рд┐рдП рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд╛рдлреА рднрд╛рд░реА рд╡рдЬрди рдорд╣рд╕реВрд╕ рдХрд░рддреА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╣ рд╡рд┐рдХрд▓реНрдк 3 рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред
1 рдпрд╛ 2 рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИрдВред рдореИрдВ 1 рдХреЗ рд╕рд╛рде рд░рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрд╕рдЯреАрдбреА рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдХрдо рд╣реЛрдВрдЧреЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╛ рддреЛ _all_ the range* рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ _none_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рдмреЗрд╢рдХ, рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИ рдХрд┐ Range
рдХреЗ рд▓рд┐рдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ RangeInclusive
ред рд▓реЗрдХрд┐рди (0.0..1.0).clamp(2.0_f32)
=> 0.99999994_f32
рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд╣реИред
@kennytm рддреЛ рдЕрдЧрд░ рдореИрдВ рд╡рд┐рдХрд▓реНрдк 3 рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз
рдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЧреЗ рдХреИрд╕реЗ рдмрдврд╝рдирд╛ рд╣реИ?
@EdorianDark рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ @
рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡рд┐рдХрд▓реНрдк 2 рдкрд╕рдВрдж рд╣реИ, рдХреЗрд╡рд▓ RangeInclusive
ред рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ "рдЖрдВрд╢рд┐рдХ рдХреНрд▓реИрдВрдкрд┐рдВрдЧ" рдкрд╣рд▓реЗ рд╕реЗ рд╣реА min
рдФрд░ max
ред
рдореИрдВ @SimonSapin рд╕реЗ рд╕рд╣рдордд рд░рд╣реВрдВрдЧрд╛ ред рд╡рд┐рдХрд▓реНрдк 3 рдХреЗ рд╕рд╛рде, рдореИрдВ рд╕рдВрднрд╡рддрдГ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд▓рдЧрддрд╛ рд╣реИред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ/рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдХреНрд▓реИрдВрдк рдХреЗ рд╕рд╛рде @kennytm рдиреЗ рдкрд╣рд▓реЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд┐рдпрд╛ рдерд╛ , 7 рдореЗрдВ рд╕реЗ 5 (рд╕реНрд╡рд┐рдлреНрдЯ рдФрд░ рдХреНрдпреВрдЯреА рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдореЗрдВ рдкрд╣рд▓реЗ рдореВрд▓реНрдп рд╣реИ, рдлрд┐рд░ рд╢реНрд░реЗрдгреАред
рдХреНрд▓реИрдВрдк рдЕрдм рдлрд┐рд░ рд╕реЗ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╣реИ!
рдореИрдВ рдЦреБрд╢ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рдЕрдм рд╕реНрд╡реАрдХрд╛рд░реНрдп рдмрдирд╛ рджрд┐рдпрд╛, рдЬрдмрдХрд┐ рдпрд╣ #44097 рдореЗрдВ рдирд╣реАрдВ рдерд╛ред
рдЕрдм рд╣рдореЗрдВ #48552 рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЕрд╡рдзрд┐ рдорд┐рд▓ рдЧрдИ рд╣реИ, рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рддреБрд░рдВрдд рдЕрдиреБрдорд╛рди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдпред
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!
@kennytm рдореИрдВ рд╕рд┐рд░реНрдл рдЖрдкрдХреЛ #48552 рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП @EdorianDark рдЗрд╕рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЗрд╕реЗ рдЕрдВрдд рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдЕрджреНрднреБрдд рд╣реИред
https://rust.godbolt.org/z/JmLWJi
pub fn clamped(a: f32) -> f32 {
a.clamp(0.,255.)
}
рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:
vxorps xmm1, xmm1, xmm1
vmaxss xmm0, xmm1, xmm0
vmovss xmm1, dword ptr [rip + .LCPI0_0]
vminss xmm0, xmm1, xmm0
рдЬреЛ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ ( vmaxss
рдФрд░ vminss
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди:
pub fn maxmined(a: f32) -> f32 {
(0f32).max(a).min(255.)
}
рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
vxorps xmm1, xmm1, xmm1
vmaxss xmm0, xmm0, xmm1
vminss xmm0, xmm0, dword ptr [rip + .LCPI1_0]
рдХреНрдпрд╛ рдпрд╣ рдХреНрд▓реИрдВрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рд╣реИ, рдпрд╛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛ рд╣реИ?
@kornelski clamp
рдПрдХ NAN
рдХреЛ рдЙрд╕ NAN
рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ maxmined
рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ max
/ min
_non_- NAN
ред
рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреЛрдЬрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рджреЛрдиреЛрдВ NAN рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реЛ рдФрд░ рдЫреЛрдЯрд╛ рд╣реЛред рдФрд░ рдпрд╣ рдбреЙрдХреНрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ NAN рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдкреАрдЖрд░ рдореЗрдВ рдХреБрдЫ рдереЗ:
@scottmcm https://github.com/rust-lang/rust/pull/59327 рд╣реЛ рдЧрдпрд╛
рдпрджрд┐ рдиреНрдпреВрдирддрдо рдпрд╛ рдЕрдзрд┐рдХрддрдо NaN рд╣реИ рддреЛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рдХреНрдпреЛрдВ рд╣реЛрддреА рд╣реИ? рдореИрдВ рджрд╛рд╡реЗ рдХреЛ assert!(min <= max)
рд╕реЗ assert!(!(min > max))
рдореЗрдВ рдмрджрд▓ рджреВрдВрдЧрд╛, рддрд╛рдХрд┐ рдЕрдзрд┐рдХрддрдо рдФрд░ рдиреНрдпреВрдирддрдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд░рд╣ рд╣реА рдиреНрдпреВрдирддрдо рдпрд╛ рдЕрдзрд┐рдХрддрдо рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рди рдкрдбрд╝реЗред
рдХреНрд▓реИрдореНрдк рдореЗрдВ min
рдпрд╛ max
рд▓рд┐рдП NAN рд╕рдВрднрд╡рддрдГ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ, рдФрд░ рд╣рдореЗрдВ рд▓рдЧрд╛ рдХрд┐ рдЖрдИрдУ рдХреЛ рдЕрдирдХреНрд▓реИрдВрдк рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЦрд┐рд▓рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдШрдмрд░рд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрджрд┐ рдЖрдк рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдЖрдк рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ INF рдФрд░ -INF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? рдЬреЛ NaN рдХреЗ рд╡рд┐рдкрд░реАрдд рдЧрдгрд┐рддреАрдп рдЕрд░реНрде рднреА рд░рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдЗрд╕рдХреЗ рд▓рд┐рдП max
рдФрд░ min
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред
@Xaeroxe рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╢рд╛рдпрдж рдпрд╣ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╕реНрдерд┐рд░ рдХреЛрдб рддреЛрдбрд╝ рджреЗрдЧрд╛?
рдПрдХ рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ IMO рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╡рд╣ рд╣реИ f32
/ f64
рдПрдХрддрд░рдлрд╛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╣реБрдИ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрджрд┐ рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдВрдк рдХрд╛ рдЗрдирдкреБрдЯ NAN рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рд╕реАрдорд╛ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ NAN рд╣реЛрдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореМрдЬреВрджрд╛ f32::min
рдФрд░ f64::max
рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдВрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рдЬрдВрдЧ-рд╕рдВрдЦреНрдпрд╛/рд╕рдВрдЦреНрдпрд╛-рд▓рдХреНрд╖рдг#122 рджреЗрдЦреЗрдВред)
рдореИрдВ рдЗрд╕реЗ рдХреНрдпреЛрдВ рд▓рд╛рддрд╛ рд╣реВрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреЛ-рддрд░рдлрд╛ clamp
рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреЛ-рддрд░рдлрд╛ рдФрд░ рдПрдХ-рддрд░рдлрд╛ рдХреНрд▓реИрдВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╕рдВрдЧрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
input.clamp(min, max)
, input.clamp_min(min)
, рдФрд░ input.clamp_max(max)
input.clamp(min..=max)
, input.clamp(min..)
, input.clamp(..=max)
input.clamp(min, max)
, input.clamp(min, std::f64::INFINITY)
, input.clamp(std::f64::NEG_INFINITY, max)
рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде ( min
рдФрд░ max
рдЕрд▓рдЧ f32
/ f64
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ), рд╣рдореЗрдВ рд╡рд┐рдХрд▓реНрдк 1 рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ , рдпрд╛ рд╡рд┐рдХрд▓реНрдк 3, рдЬреЛ IMO рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИред рд╣рдореЗрдВ рдмрд╕ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрд▓рд┐рджрд╛рди рдХреЛ рдЕрд▓рдЧ clamp_min
рдФрд░ clamp_max
рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдкрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ/рдирдХрд╛рд░рд╛рддреНрдордХ рдЕрдирдВрдд рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
impl f32 {
pub fn clamp<T>(self, bounds: T) -> f32
where
T: RangeBounds<f32>,
{
// ...
}
}
// and for f64
рдЪреВрдВрдХрд┐ f32
/ f64
рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп Ord
рд╡рд┐рдкрд░реАрдд, рд╡рд┐рд╢реЗрд╖ рд╕реАрдорд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред рдмреЗрд╢рдХ, рддрдм рд╣рдо рд╢рд╛рдпрдж Ord::clamp
рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП RangeInclusive
рддрд░реНрдХ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рдд рдХреА рдкреНрд░рдмрд▓ рд░рд╛рдп рдпрд╛ рддреЛ рджреЛ рддрд░реНрдХ рдпрд╛ рдПрдХ рд╣реА рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ RangeInclusive
рдХреЗ рд▓рд┐рдП рддрд░реНрдХ Ord::clamp
ред
рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реБрд▓рдЭрд╛ рд╣реБрдЖ рдореБрджреНрджрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдореИрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдЙрдард╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ред
рдЯреНрд░рд╛рдЗрдПрдЬ: рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ NaN рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ Ord::clamp
рдкрд╣рд▓реЗ NaN рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрд░ рдмреНрд▓реЙрдХ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ?
```рдЬрдВрдЧ
рдкрдм рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреНрд░рдо: Eq + PartialOrd
//тАж
рдПрдлрдПрди рдХреНрд▓реИрдВрдк (рд╕реНрд╡рдпрдВ, рдиреНрдпреВрдирддрдо: рд╕реНрд╡рдпрдВ, рдЕрдзрд┐рдХрддрдо: рд╕реНрд╡рдпрдВ) -> рд╕реНрд╡рдпрдВ рдЬрд╣рд╛рдВ рд╕реНрд╡рдпрдВ: рдЖрдХрд╛рд░ {...}
}
рдЗрдореНрдкреНрд▓рд╛ f32 {
рдкрдм рдПрдлрдПрди рдХреНрд▓реИрдВрдк (рд╕реНрд╡рдпрдВ, рдиреНрдпреВрдирддрдо: рдПрдл 32, рдЕрдзрд┐рдХрддрдо: рдПрдл 32) -> рдПрдл 32 {...}
}
рдЗрдореНрдкреНрд▓рд╛ f64 {
рдкрдм рдПрдлрдПрди рдХреНрд▓реИрдВрдк (рд╕реНрд╡рдпрдВ, рдиреНрдпреВрдирддрдо: рдПрдл 64, рдЕрдзрд┐рдХрддрдо: рдПрдл 64) -> рдПрдл 64 {...}
}
@SimonSapin рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА
+1, рдпрд╣ рдПрдХ рдкреВрд░реНрдг рдЖрд░рдПрдлрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддрдм рд╕реЗ рдХреБрдЫ рднреА рд╕рд╛рдордЧреНрд░реА рд╕рд╛рдордиреЗ рдЖрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IRLO рдФрд░ RFC рдЪрд░реНрдЪрд╛ рдореЗрдВ NaN рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ ред
рдареАрдХ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред
@rfcbot fcp рдорд░реНрдЬ
рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп @SimonSapin рдиреЗ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдмрд╛рдХреА рдЯреИрдЧ рдХреА рдЧрдИ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдореАрдХреНрд╖рд╛ рд╣реИ:
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИред
рдПрдХ рдмрд╛рд░ рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдореАрдХреНрд╖рдХ рд╕реНрд╡реАрдХреГрддрд┐ рджреЗ рджреЗрддреЗ рд╣реИрдВ (рдФрд░ рдЕрдзрд┐рдХрддрдо 2 рдЕрдиреБрдореЛрджрди рдмрдХрд╛рдпрд╛ рд╣реИрдВ), рддреЛ рдпрд╣ рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдмреЛрд▓реЗрдВ!
рдЯреИрдЧ рдХреА рдЧрдИ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдореБрдЭреЗ рдХреНрдпрд╛ рдЖрджреЗрд╢ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП
рдХреНрдпрд╛ x.clamp(7..=13)
рдмрдирд╛рдо x.clamp(7, 13)
рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? https://github.com/rust-lang/rust/issues/44095#issuecomment -533764997 рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ f64::clamp
ред
@ рдПрдо-рдХрд╣рд╛рдВ-рд╕реЗ рджреЗрдЦреЗрдВ рдЪрд░реНрдЪрд╛ рд╕реЗ рд╢реБрд░реВ https://github.com/rust-lang/rust/issues/44095#issuecomment -+рекрез,резрек,релрен,рейрезрей рдФрд░ рднреА https://github.com/rust-lang/rust/pull/ 58710#рдкреБрд▓рдЕрдиреБрд░реЛрдзрд╕рдореАрдХреНрд╖рд╛ -207529970.
рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ .min
рдФрд░ .max
рдЕрдХреНрд╕рд░ рдмрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдКрдкрд░реА рд╕реАрдорд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .min(...)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ .max(...)
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкрд░рд┐рдмрдВрдзред рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдЧ рджреЗрдЦреЗ рд╣реИрдВред .clamp(..1.0)
рдФрд░ .clamp(0.0..)
рдмрд╕ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред
@CryZe рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ рдмрдирд╛рддрд╛ рд╣реИ: рднрд▓реЗ рд╣реА рдЖрдк min = рдЕрдкрд░ рдмрд╛рдЙрдВрдб, рдореИрдХреНрд╕ = рд▓реЛрдЕрд░ рдмрд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рдХрднреА рдЧрд▓рддреА рди рдХрд░реЗрдВ, рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╕рд┐рдХ рдЬрд┐рдореНрдирд╛рд╕реНрдЯрд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЖрдк рдЬрд┐рд╕ рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕ рдкрд░ рдпрд╣ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ x.clamp(y, z)
рдЕрдзрд┐рдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдирдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ;)
рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ рд░реЗрдВрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдкреНрд░рдпреЛрдЧ рдХрд┐рдП, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдХрдИ рдорд╣реАрдиреЛрдВ рдХреА рджреЗрд░реА рднреА рдХреА рддрд╛рдХрд┐ рд╣рдо рд╕рдорд╛рд╡реЗрд╢реА рд░реЗрдВрдЬ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред (рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)
рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдкрд░ рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ рд░реЗрдВрдЬ рдХреЗ рд▓рд┐рдП рдХреНрд▓реИрдВрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдХреЗрд╡рд▓ рдХреБрдЫ рд░реЗрдВрдЬ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реБрдЖ, рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА рдореИрдВрдиреЗ рдЖрд░рдПрдлрд╕реА рдХреЛ рдХрдИ рдорд╣реАрдиреЛрдВ рддрдХ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдХреА, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдЕрдВрддрддрдГ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдереАрдВред
@m-ou-se #44095 (рдЯрд┐рдкреНрдкрдгреА) рдФрд░ #58710 (рд╕рдореАрдХреНрд╖рд╛) рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреБрд▓ рдЕрдиреБрд░реЛрдз (#58710) рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдп рдХреА рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рд╕рдВрдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдЖрдорддреМрд░ рдкрд░ рдбрд┐рдЬрд╛рдЗрди рдЪрд░реНрдЪрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред
рдХреЗрд╡рд▓ рдХреБрдЫ рд╢реНрд░реЗрдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЛ рдирд╣реАрдВ, рдПрдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдерд╛
рдЬрдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдирддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛), рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ clamp
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/rust-lang/rfcs/pull/1961#issuecomment -302600351
@Xaeroxe рдХреЗрд╡рд▓ рдХреБрдЫ рд╢реНрд░реЗрдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
рдпрджрд┐ рдЖрдк рдЙрдирдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рдереЗ, рдХреНрдпрд╛ рд╕рдордп рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдиреЗ рдЖрдкрдХреА рд░рд╛рдп рдмрджрд▓ рджреА рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдРрд╕рд╛ рд╣реА рд╣реИ?
рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЕрдирдиреНрдп рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдХрднреА рднреА рдлреНрд▓реЛрдЯ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ (рд░реЗрдВрдЬ 0..10
рдореЗрдВ рдирд┐рдЪрд▓реА рдмрд╛рдЙрдВрдб рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдКрдкрд░реА рдмрд╛рдЙрдВрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕реАрдорд╛ 0.0...10.0
рдХреНрдпреЛрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
@varkor рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдж, рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ред
рдпрд╣ рдЕрддреНрдпрдзрд┐рдХ рдЯрдХрд░рд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдордиреЗ рдЖ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ "рдЬрдм рдореИрдВрдиреЗ рдмрд╛рддрдЪреАрдд рдХреЛ рджреЗрдЦрд╛ рддреЛ рдореБрдЭреЗ рдХреЛрдИ рдареЛрд╕ рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ рд╣рдореЗрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдЗрд╕рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?"ред
рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рддрд░реНрдХ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдпрд╣рд╛рдБ рд╣реИ: https://github.com/rust-lang/rfcs/pull/1961#issuecomment -302600351
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ @Xaeroxe рдиреЗ рдореБрдЭреЗ рдЗрд╕реЗ рд╣рд░рд╛ рджрд┐рдпрд╛ :)
рд╕рдордп рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдиреЗ рдЖрдкрдХреА рд░рд╛рдп рдмрджрд▓ рджреА рд╣реИ
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдм рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рдХреБрдЫ рдРрд╕реА рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВ рдЕрдкрдиреЗ рджреИрдирд┐рдХ рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЖрдВрд╢рд┐рдХ рд╢реНрд░реЗрдгреА рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд░рд╛рдЬреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рднрд▓реЗ рд╣реА рд╣рдо рдЙрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░ рд▓реЗрдВ, рдлрд┐рд░ рднреА рдХрдИ рдЕрдиреНрдп рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ scottmcm RFC рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Step
рдЬрд┐рддрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ Ord
рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдорд╛рдореВрд▓реА рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЦреЛрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдЧреИрд░-рд╕рдорд╛рд╡реЗрд╢реА рд░реЗрдВрдЬ рдХреНрд▓реИрдВрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ? рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдпрд╛ рдврд╛рдВрдЪреЗ рдХреЛ рдЕрдирдиреНрдп рд░реЗрдВрдЬ рдХреНрд▓реИрдВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реБрдИ, рддреЛ рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ? рдПрдХ рд╕рдВрддреЛрд╖рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдЬ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдард┐рди рдереЗ, рдФрд░ рдХрдИ рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдФрд░ рдХреБрдЫ рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдПред
рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рддреЛ рдХреБрдЫ рдХрд╛рд░рдг рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрд╡рд╢реНрдпрдХ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдиреНрдпрд╛рд╕ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╢реНрд░реЗрдгреА, Range
ред
рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдПрдлрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрдЧреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдПрд╕рдЯреАрдбреА рд╣рд╛рд╕рд┐рд▓ рд╣реЛрддреА рд╣реИ рдЬреЛ .max()
рдпрд╛ .min()
рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЖрд░рдПрдлрд╕реА рдХреЛ рд╡рд╛рдкрд╕ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рддрд╛рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдВрдЧ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрднреА рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ред
... рдЗрд╕рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЪреАрдЬ рдПрд╕рдЯреАрдбреА рд╣рд╛рд╕рд┐рд▓ рд╣реЛрддреА рд╣реИ, рд╡рд╣ рд╣реИ
.max()
рдпрд╛.min()
рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ред
рдкреНрд░рд╛рдердорд┐рдХ рдмрд┐рдВрджреБ рдЬреЛ рдореИрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ .min()
/ .max()
рдмреАрдЪ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдирддрд╛ рджреЗрдЦреА рд╣реИ рдФрд░ рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдВрдк рдЪрд░реНрдЪрд╛ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдЪрд╛рд▓рди рд╕рдордХрдХреНрд╖ рдирд╣реАрдВ рд╣реИрдВ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП NAN
ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, input.max(0.)
рдХреЛ рдЛрдгрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдВрдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВред рдпрджрд┐ input
рдЧреИрд░- NAN
, рддреЛ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм input
рд╣реИ NAN
, рддреЛ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди 0.
ред рдпрд╣ рд▓рдЧрднрдЧ рдХрднреА рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИ; рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рдХреЛ NAN
рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред ( рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред) рдЕрдВрдд рдореЗрдВ, .max()
рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдВрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрддрд░рдлрд╛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди ( .min()
/ .max()
) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдЧреИрд░-рдЕрд╕реНрдерд╛рдпреА-рдмрд┐рдВрджреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдПрдХрддрд░рдлрд╛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рддрд░реНрдХ рджрд┐рдПред рдЕрдЧрд▓рд╛ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рд╕рдВрдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
.clamp()
рд╕рд╛рде INFINITY
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХрддрд░рдлрд╛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рди рдЬреЛрдбрд╝реЗрдВ; рдмрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ .clamp()
рдХрд╛ рдЙрдкрдпреЛрдЧ INFINITY
рдпрд╛ NEG_INFINITY
рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ input.clamp(0., std::f64::INFINITY)
рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред
рдпрд╣ рдмрд╣реБрдд рд╣реА рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЧрд▓рдд .min()
/ .max()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдпрджрд┐ рд╡реЗ NAN
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ T: Ord
рд▓рд┐рдП рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ IMO рдпрд╣ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИред
.clamp_min()
рдФрд░ .clamp_max()
рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк .clamp_min()
рдФрд░ .clamp_max()
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ; рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рдереЗ рдХрд┐ рдпрджрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд clamp
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИ clamp
рдПрдХ рд╢реНрд░реЗрдгреА рддрд░реНрдХ рд▓реЗрдВред @Xaeroxe рдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрд▓рд╛рдЗрд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ ( SliceIndex
рд╡рд┐рд╢реЗрд╖рддрд╛)ред рдпрд╣ рдЙрди рд╕рднреА рдЖрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЪрд░реНрдЪрд╛ рдореЗрдВ рджреЗрдЦреА рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рд╢реНрд░реЗрдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ .clamp_min()
/ .clamp_max()
рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИред Ord
, рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:
pub trait Ord: Eq + PartialOrd<Self> {
// ...
fn clamp<B>(self, bounds: B) -> B::Output
where
B: Clamp<Self>,
{
bounds.clamp(self)
}
}
pub trait Clamp<T> {
type Output;
fn clamp(self, input: T) -> Self::Output;
}
impl<T> Clamp<T> for RangeFull {
type Output = T;
fn clamp(self, input: T) -> T {
input
}
}
impl<T: Ord> Clamp<T> for RangeFrom<T> {
type Output = T;
fn clamp(self, input: T) -> T {
if input < self.start {
self.start
} else {
input
}
}
}
impl<T: Ord> Clamp<T> for RangeToInclusive<T> {
type Output = T;
fn clamp(self, input: T) -> T {
if input > self.end {
self.end
} else {
input
}
}
}
impl<T: Ord> Clamp<T> for RangeInclusive<T> {
type Output = T;
fn clamp(self, input: T) -> T {
assert!(self.start <= self.end);
let mut x = input;
if x < self.start { x = self.start; }
if x > self.end { x = self.end; }
x
}
}
рдЗрд╕ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:
T: Ord + Step
редClamp
рд╡рд┐рд╢реЗрд╖рддрд╛ рд░рд╛рдд-рдХреЗрд╡рд▓, рдХреЗ рд╕рдорд╛рди SliceIndex
рд╡рд┐рд╢реЗрд╖рддрд╛редf32
/ f64
, рд╣рдо рдХрд░ рд╕рдХрддреЗ рдереЗ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ T: PartialOrd
ред (рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ clamp
рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди Ord
рдмрдЬрд╛рдп PartialOrd
ред рд╢рд╛рдпрдж рдореБрдЭреЗ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдХреБрдЫ рдпрд╛рдж рдЖрдпрд╛? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ PartialOrd
рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред)
рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ f32
рдФрд░ f64
рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВред (рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рд╣рдо рдмрд╛рдж рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рд╡рд┐рдХрд▓реНрдк i рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)
рдФрд░ рдлрд┐рд░ рдЬреЛрдбрд╝реЗрдВ
impl f32 {
// ...
fn clamp<B>(self, bounds: B) -> B::Output
where
B: Clamp<Self>,
{
bounds.clamp(self)
}
}
impl f64 {
// ...
fn clamp<B>(self, bounds: B) -> B::Output
where
B: Clamp<Self>,
{
bounds.clamp(self)
}
}
рд╣рдо рдЪрд╛рд╣реЗрдВ рддреЛ рдмрд╛рдж рдореЗрдВ Clamp
рдХреЛ f32
/ f64
рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ( @scottmcm рдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдХрд┐ рдпрд╣ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ std
рдЬрд╛рдирдмреВрдЭрдХрд░ f32
/ f64
рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ std
рдЙрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИ; рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реЛ? рднрд▓реЗ рд╣реА, рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред)
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо Clamp
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ f32
/ f64
рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рднреА рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ @varkor рдмрддрд╛рддреЗ рд╣реИрдВ, рд░рд╕реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Copy
рдФрд░ Iterator
/ IntoIterator
рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд░реЗрдВрдЬ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред (рдЖрдИрдПрдордУ, рдпрд╣ std
рдХрд╛ рдПрдХ рдорд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рд╢реНрд░реЗрдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред) рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢реНрд░реЗрдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ ( "рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп std::ops::Range<f32>: Clamp<f32>
рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ")ред
рдореИрдВрдиреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП Output
рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рдЙрддрдирд╛ рд╣реА рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ Clamp
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдиреНрдпреВрдирддрдо рдЙрдкрдпреЛрдЧреА рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, " .clamp()
рд╕рд╛рде INFINITY
" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрд╛рдлреА рдиреБрдХрд╕рд╛рди рд╣реИрдВред
"рдореМрдЬреВрджрд╛ .clamp
" + .clamp_min()
+ .clamp_max()
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
input.clamp_min(0)
рдмрдЬрд╛рдп input.clamp(0..)
ред.clamp()
рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо u32
рдорд╛рди рдХреЛ u8
рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЬреЛ рдХрд┐ RFC рдЪрд░реНрдЪрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ред рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЛ .saturating_into()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХ рдХреНрд▓реИрдВрдкрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред.min()
, .max()
, .clamp_min()
, рдФрд░ .clamp_max()
рдХреЗ рдмреАрдЪ рдХреЛрдИ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ( .clamp_min()
рд╕рд╛рде рдХреНрд▓реИрдВрдкрд┐рдВрдЧ .max()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ .clamp_max()
рд╕рд╛рде рдХреНрд▓реИрдВрдкрд┐рдВрдЧ .min()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред) рд╣рдо рдЬреНрдпрд╛рджрд╛рддрд░ рдирд╛рдо рджреЗрдХрд░ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди .clamp_lower()
/ .clamp_upper()
рдпрд╛ .clamp_to_start()
/ .clamp_to_end()
рдмрдЬрд╛рдп .clamp_min()
/ .clamp_max()
, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ ( input.clamp_lower(0)
рдмрдирд╛рдо input.clamp(0..)
)редрд░реЗрдВрдЬ рддрд░реНрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
.clamp_min()
/ .clamp_max()
рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИредClamp
рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрд░реЗрдВрдЬ рддрд░реНрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрдирд╛рдо "рдореМрдЬреВрджрд╛ .clamp
" + .clamp_min()
+ .clamp_max()
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдореЗрд░реА рдХреЛрдИ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рд╕реМрджреЗрдмрд╛рдЬреА рд╣реИред
@Xaeroxe
рдпрд╣ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ, рд╣рдо рдЕрднреА рднреА рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВредрдореИрдВ рдЗрд╕реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд╛рдЦрд╛ рдХреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?
рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдВрдкрд┐рдВрдЧ рдкрд░
рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдореЗрдВ рд╕рдорд╛рд╡реЗрд╢реА рд╣реИ, рдХреЛрдИ рдХреЗрд╡рд▓ рдПрдХ-рддрд░рдлрд╛ рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдПрдВ/рджрд╛рдПрдВ рдкрд░ рдиреНрдпреВрдирддрдо/рдЕрдзрд┐рдХрддрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдФрд░ рдпрдХреАрдирди .clamp((Bound::Unbounded, Inclusive(3.2)))
рдЬрд╣рд╛рдВ рдХреЛрдИ Range*
рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡реИрд╕реЗ рднреА рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ:
x.clamp(i32::MIN, 10);
x.clamp(-f32::INFINITY, 10.0);
рдХреЛрдИ рдкреВрд░реНрдг рд╣рд╛рдирд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрд▓рдПрд▓рд╡реАрдПрдо рдореГрдд рдкрдХреНрд╖ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИ: https://rust.godbolt.org/z/l_uBLO
рд░реЗрдВрдЬ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди clamp
рдЗрддрдирд╛ рдмреБрдирд┐рдпрд╛рджреА рд╣реИ рдХрд┐ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХ рдареАрдХ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИрдВред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ min
/ max
NaN
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕реНрд╡рдпрдВ рд╣реА рддрдп рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП f32
рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдХрд░? рдпрд╛ PartialOrd::min/max
? (рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд░рд╕реНрдЯ libstd рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдЯреЙрдЧрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ)ред
@scottmcm рддреБрдо рдмрд╛рд╣рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП RangeToInclusive ред
рдЗрд╕ рдкрд░ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ "рдЖрд░рдПрдлрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛" рдХреЛ рдмрджрд▓рд╛рд╡ рди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдЕрдкрдиреА рдорд╛рдирд╕рд┐рдХрддрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрд▓реИрдВрдк рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдПрдХ рд╕реАрдорд╛ рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИред рд╡рд╣ рдореЗрд░реЗ рдШреБрдЯрдиреЗ рдХреЗ рдЭрдЯрдХреЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдереА, рдФрд░ рдпрд╣ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рддреЛ рдЖрдЗрдП рдЗрд╕ рддрд░рд╣ рд╕реЗ рдРрд╕рд╛ рди рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдПрдБ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЙрдирдХрд╛ рдЦрдВрдбрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрд╡рд╢реНрдпрдХ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдиреНрдпрд╛рд╕ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╢реНрд░реЗрдгреА, Range
ред
Range*
рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╕реАрдорд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЬреИрд╕реЗ Ord + Step
ред рдЗрд╕рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ рд░реЗрдВрдЬ рдХреНрд▓реИрдореНрдк рдХреА рдЕрдХреНрд╕рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реЗрдВрдЬ рдХреА рдкреВрд░реА рд░реЗрдВрдЬ рдХреЛ рдпрд╣рд╛рдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдЙрди рд░реЗрдВрдЬ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдП, рдЬрд┐рдирдореЗрдВ рдпреЗ рддрдХрдиреАрдХреА рд╕реАрдорд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВредрд╣рдо рдХреЗрд╡рд▓ рдПрдХ рддрд░рдлрд╛ рдХреНрд▓реИрдВрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдиреНрдлрд┐рдирд┐рдЯреА/рдиреНрдпреВрдирддрдо/рдЕрдзрд┐рдХрддрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Range*
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╡рд░реНрдг рдФрд░ рдХрдо рдЖрдпрд╛рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВредрдЕрдм рдЬрдмрдХрд┐ рд╣рдордиреЗ рдРрд╕рд╛ рди рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХрд╛ рдЦрдВрдбрди рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд▓реНрдк рд╕рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЖрдЗрдП рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░реЗрд░рдгрд╛ рдЦреЛрдЬреЗрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░рдг рд╣реИ, рдЬреЛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЖрдо рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реАрдорд╛ рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рднрд╛рд╖рд╛ рдХреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред рди рдХреЗрд╡рд▓ рд╕рдорд╛рд╡реЗрд╢реА рдбрдмрд▓ рдПрдВрдбреЗрдб рд░реЗрдВрдЬ рдХреНрд▓реИрдВрдк рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ .min()
рдФрд░ .max()
рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреАред
рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд░реЗрдЦрд╛ рдХрд╛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдХрд░реНрд╖рдг рд╣реИ рдЬреЛ рдЖрд░рдПрдлрд╕реА рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓реИрдореНрдк рдХреЛ рдореМрдЬреВрджрд╛ рд╕реНрд╡рд░реВрдк рдореЗрдВ рд╣реА рдЫреЛрдбрд╝ рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИред
рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз #58710 рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рддреЛ рдореИрдВрдиреЗ рд░реЗрдВрдЬ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рд▓реЗрдХрд┐рди rust-lang/rfcs#1961 (рдЯрд┐рдкреНрдкрдгреА) ) рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛, рдХрд┐ рдпрд╣ рдорд╛рдирдХ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд░ #[must_use]
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рд░рд╕реНрдЯ рдиреНрдпреВрдореЗрд░рд┐рдХреНрд╕ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрднреНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИрдВред рдХрд╣рдиреЗ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐, рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдЧрд▓рдд) рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛:
let mut x: f64 = some_number_source();
x.clamp(0.0, 1.0);
//Proceeds to assume that 0.0 <= x <= 1.0
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд░рд╕реНрдЯ рдЕрдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП (number).method()
рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрддрд╛ рд╣реИ (рдЬрдмрдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ Math.Method(number)
), рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рднреА, рдпрд╣ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдзрд╛рд░рдгрд╛ рд╣реЛрдЧреА рдХрд┐ рдпрд╣ number
рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
[must_use]
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬреЛрдбрд╝реА
@ рдЬрд╝реЗрд░реЙрдХреНрд╕ рдХреНрдпрд╛ рдЖрдк рд░реЗрдВрдЬ рдЖрдзрд╛рд░рд┐рдд рдХреНрд▓реИрдВрдк рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓реЗрдХрд░ рдЖрдП рд╣реИрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреА рд╣реИ, рдЬрдВрдЧ рдХреЗ рдЕрдиреНрдп рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдЗрд╕ рд╕рдордп рдореБрдЭреЗ рд░реЗрдВрдЬ рдЖрдзрд╛рд░рд┐рдд рдХреНрд▓реИрдВрдк рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рд╣рд╛рдВ, рдЖрдЗрдП 'рдорд╕реНрдЯ_рдпреВрдЬ' рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВред
@SimonSapin @scottmcm рдХреНрдпрд╛ рд╣рдо рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдЬреИрд╕рд╛ рдХрд┐ @ jturner314 рдиреЗ рдХрд╣рд╛, рдСрд░реНрдб рдХреЗ рдмрдЬрд╛рдп рдкрд╛рд░реНрдЯрд┐рдпрд▓рдСрд░реНрдб рдкрд░ рдХреНрд▓реИрдВрдк рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдлреНрд▓реЛрдЯреНрд╕ рдкрд░ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ f32::clamp
рдФрд░ f64::clamp
рд╣реИред
рдореИрдВ рдпрд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
use num_traits::float::FloatCore;
struct Foo<T> (T);
impl<T: FloatCore> Foo<T> {
fn foo(&self) -> T {
self.0.clamp(1, 10)
}
}
fn main() {
let foo = Foo(15.3);
println!("{}", foo.foo())
}
рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред
PartialOrd
рдПрдХ рдлреНрд▓реЛрдЯ-рдУрдирд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИред рдлреНрд▓реЛрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рд╣реЛрдиреЗ рд╕реЗ рдХрд╕реНрдЯрдо PartialOrd
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд▓реИрдВрдк рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП Eq
, рднрд▓реЗ рд╣реА рд╡рд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗред
PartialOrd
рд╕рд╛рде рдкреНрд░рдореБрдЦ рдЪрд┐рдВрддрд╛ рдпрд╣ рдереА рдХрд┐ рдпрд╣ рдХрдордЬреЛрд░ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреНрд▓реИрдВрдк рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЛ рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ PartialOrd
рд╣реЛ, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ https://docs.rs/num/0.2.1/num/fn.clamp.html
рдпреЗ рдЧрд╛рд░рдВрдЯреА рдХреНрдпрд╛ рд╣реИрдВ?
рдПрдХ рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдЕрдкреЗрдХреНрд╖рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ x.clamp(a, b) == x
рддреЛ a <= x && x <= b
ред рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ PartialCmp
рдЬрд╣рд╛рдВ x
рдпрд╛ рддреЛ a
рдпрд╛ b
рд╕рд╛рде рдЕрддреБрд▓рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЕрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╛рдж рдХрд┐рдП рдЧрдП clamp()
рддрд▓рд╛рд╢ рдореЗрдВ рдЖрдЬ рдпрд╣рд╛рдВ рдЖрдпрд╛ рдФрд░ рд░реБрдЪрд┐ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рд╛ред
рдореИрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдФрд░ рдХрдИ рдирд╛рдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдордЭреМрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ "рд╡рд┐рдХрд▓реНрдк рдЪрд╛рд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдХреЗ рд╕рд╛рде рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рдпрд╣рд╛рдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдХрдбрд╝рдирд╛ рд╣реИ:
#![allow(unstable_name_collisions)]
pub trait Clamp: Sized {
fn clamp<L, U>(self, lower: L, upper: U) -> Self
where
L: Into<Option<Self>>,
U: Into<Option<Self>>;
}
impl Clamp for f32 {
fn clamp<L, U>(self, lower: L, upper: U) -> Self
where
L: Into<Option<Self>>,
U: Into<Option<Self>>,
{
let below = match lower.into() {
None => self,
Some(lower) => self.max(lower),
};
match upper.into() {
None => below,
Some(upper) => below.min(upper),
}
}
}
#[test]
fn test_clamp() {
assert_eq!(1.0, f32::clamp(2.0, -1.0, 1.0));
assert_eq!(-1.0, f32::clamp(-2.0, -1.0, 1.0));
assert_eq!(1.0, f32::clamp(2.0, None, 1.0));
assert_eq!(-1.0, f32::clamp(-2.0, -1.0, None));
assert_eq!(2.0, f32::clamp(2.0, -1.0, None));
assert_eq!(-2.0, f32::clamp(-2.0, None, 1.0));
}
рдпрджрд┐ рдпрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдереЗ std
рдПрдХ рдХрдВрдмрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ T: Ord
, рдЬреЛ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдард╛рдпрд╛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ PartialOrd
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ clamp()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕реНрдерд┐рд░ рдирд╛рдо рдЯрдХрд░рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЪреЗрддрд╛рд╡рдиреА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП "рдХреНрд▓реИрдВрдк" рдирд╛рдо рдареАрдХ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдХрд┐ clamp(a,b,c)
рдХреЛ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ min(max(a,b), c)
ред
рдЪреВрдВрдХрд┐ max
рдФрд░ min
рдХреЛ PartialOrd
рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рди рд╣реА clamp
рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
NaN
рдореБрджреНрджреЗ рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА
@EdorianDark рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо рдХреЛ рднреА рдХреЗрд╡рд▓ рдкрд╛рд░реНрдЯрд┐рдпрд▓рдСрд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
@noonien min
рдФрд░ max
рдХреЛ Rust 1.0 рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ Ord
рдФрд░ f32
рдФрд░ f64
рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИред
рдЗрди рд╕рдорд╛рд░реЛрд╣реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╣реА рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ min
, max
рдФрд░ clamp
рддреБрд▓рдиреАрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ PartialOrd
рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп float
рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ Ord
, рд▓реЗрдХрд┐рди 1.0 рдХреЗ рдмрд╛рдж рдЕрдм рдЗрд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдЕрдм рд▓рдЧрднрдЧ рдбреЗрдврд╝ рд╕рд╛рд▓ рд╕реЗ рд╡рд┐рд▓рдп рдФрд░ рдЕрд╕реНрдерд┐рд░ рд╣реИред рд╣рдо рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ?
рдореБрдЭреЗ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛!
рдпрджрд┐ clamp
рд╡рд┐рдзрд┐ рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ https://github.com/rust-lang/rust/pull/66852#issuecomment -561667812 рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдирд╛рдо рд╕рдорд╛рдзрд╛рди рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдФрд░ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА рдЗрд╕рдХреЗ рд╕рд╛рде рднреАред
@Xaeroxe рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ libs рдЯреАрдо рдХреА рд╕рд╣рдорддрд┐ рдорд╛рдВрдЧрдирд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ t-libs рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЧреИрд░-fcped рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рдореЗрд▓ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд┐рдпрд╛ https://github.com/rust-lang/rust/pull/77872
@matklad рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ FCP рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ https://github.com/rust-lang/rust/issues/44095#issuecomment -544393395 рдкрд░ рдкрд╣рд▓реЗ рд╣реА рд╢реБрд░реВ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╢реЗрд╖ рдЪреЗрдХрдмреЙрдХреНрд╕ рд╣реИред
рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдореБрджреНрджреЗ рдкрд░ рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдкрд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдХрд╛рдлреА рд╕рд╣рдиреАрдп рд╣реИред
@рдХрд┐рдореБрдВрдбреА
@sfackler
@ рдирд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛
https://github.com/rust-lang/rust/issues/44095#issuecomment -544393395 рдЕрднреА рднреА рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдЬрдм рд╕реЗ FCP рд╢реБрд░реВ рд╣реБрдЖ рдерд╛ рддрдм рд╕реЗ libs рдЯреАрдо рдХрд╛рдлреА рдмрджрд▓ рдЧрдИ рд╣реИред рдХреНрдпрд╛ рддреБрдо рд╕рдм рдмрд╕ рдПрдХ рдирдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ FCP рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдореЗрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╢реЗрд╖ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрдирд╛ рдЪрд╛рд╣рд┐рдПред
@LukasKalbertodt рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдареАрдХ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓рд╛рдд рдорд╛рд░рдиреЗ рдХрд╛ рдорди рд╣реИ?
рдпрд╣рд╛рдБ FCP рд░рджреНрдж рдХрд░рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ FCP рдЕрдм рд╕реНрдерд┐рд░реАрдХрд░рдг PR рдкрд░ рд╣реБрдЖ: https://github.com/rust-lang/rust/pull/77872#issuecomment -722982535
@fcpbot рд░рджреНрдж рдХрд░реЗрдВ
рдЙрд╣
@rfcbot рд░рджреНрдж рдХрд░реЗрдВ
@m-ou-se рдкреНрд░рд╕реНрддрд╛рд╡ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрд╣реБрдд рдмреБрд░реА рдЬрдЧрд╣ рдкрд░ рд╣реИрдВ рдпрджрд┐ рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЪрд╛рд╣рддреЗ рдереЗ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред