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
ìŽëŠì ì¬ì©íê³ ììŒë¯ë¡ ì¶ê°íë©Ž 몚ížíšìŽ ë°ìí©ëë€. . ìŽê²ì semver ì ì±
ì ë°ëŒ íì©ëë íììŽì§ë§ ê·žëŒìë ë¶êµ¬íê³ ë€ìŽì€ížëŠŒ íµìŠì ì ë°í©ëë€.
íììŒ ë¶ë¥ íì륌 ìíŽ ì§ëª í©ëë€.
ê·žëì ìŽë€ ìê°ìŽ ëì šëì?
ëë ìŽê²ì ë°ë³µíì§ ìë ê²ìŽ ì¢ë€ë ì ìì
restrict
clamp_to_range
min_max
(ìµìì ìµë륌 ê²°í©íë ê²ê³Œ ê°êž° ë묞ì
ëë€.)
ìŽê²ë€ì íšê³Œê° ìì ì ììµëë€. clamp
ì ìí¥ìŽ ì€ì ë¡ ìŒë§ë ëìì§ ê²°ì íêž° ìíŽ ë¶í구륌 ì¬ì©í ì ììµëê¹? clamp
ë ì¬ë¬ ìžìŽì ëŒìŽëžë¬ëŠ¬ìì ì ìžìë©ëë€.
ìŽëŠì ë°ê¿ íìê° ìë€ê³ ìê°ëë©Ž ìŠì PRì ëë늰 ë€ì ë¶í구 ë±ì ì¬ì©íì¬ ë ì ì€íê² í ì€ížíë ê²ìŽ ê°ì¥ ì¢ìµëë€. @Xaeroxe ,
íì íë. ëë ì ì ë¶í구륌 ì¬ì©í ì ìŽ ìì§ë§ ë°°ìž ì ììµëë€.
@Xaeroxe ì ì£ì¡í©ëë€. 빚늬 ëë늬Ʞ PRì ë°ê³ ì€ìŽë¯ë¡ @BurntSushi ëë @alexcrichton 곌 ê°ì ëŒìŽëžë¬ëŠ¬ì ë€ë¥ž ì¬ëìŽ íìí ì ììµëë€.)
ì§êž PRì ì€ë¹íê³ ììµëë€. ìŠê±°ìŽ íŽê° 볎ëŽìžì!
í볎 ì€ë¹ 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ê°ì ëì std ëŒìŽëžë¬ëŠ¬ì 4ì€ êž°ë¥ì ì¶ê°íë ìì ì íŽììµëë€. ë ì¢ ì§ì³€ìŽ. ëìŒí êž°ë¥ìŽ 2ìŒ ë§ì num ì ë³í©ëììŒë©° ëìê² ì¶©ë¶í©ëë€. ë€ë¥ž ì¬ëìŽ std ëŒìŽëžë¬ëŠ¬ìì ìŽê²ì ì ë§ë¡ ìíë©Ž ê³ì ì§ííììì€. ê·žë¬ë ëë ìŽê²ì ë ë€ë¥ž 6ê°ìì ìí ì€ë¹ê° ëì§ ìììµëë€.
@aturon ì ìŽì íë³Žê° ê³ì íìëëë¡ ìŽê²ì ë€ì
ììŒë¡ ì¬ëë€ì ìê°ì ëë¹íì§ ìëë¡ ìŽê²ìŽ ìë©ŽìŒë¡ ì§íëê±°ë ìŽë€ ë³ê²œ ì¬íìŽ ìëì§ì ëí ì§ì¹šìŽ ì ë°ìŽížëìŽìŒ íë€ê³ ìê°í©ëë€.
ìŽê²ìŽ íìì ììžìŽ ë ì ìë€ë ê²ì ìŒì°ë¶í° ë§€ì° ë¶ëª
íìµëë€. ê°ìžì ìŒë¡, ëë ê·žê²ì ë§ì ê²ì 깚ëšëŠ° ord_max_min
ì ë¹êµíìµëë€.
ê·žëŠ¬ê³ ìŽì ëí ìëµì " Ord::min
ìŽ ì¶ê°ëììµëë€ [...] libs íì ì€ë ìŽê²ìŽ íìì íì©íêž°ë¡ ê²°ì íìµëë€."ììµëë€. ê·žëŠ¬ê³ ê·žê²ì ë ìŒë°ì ìž ìŽëŠì ê°ì§ TMTOWTDI êž°ë¥ìŽììµëë€. ë°ë©Ž clamp
ë ë€ë¥ž íììŒë¡ stdì ìŽë¯ž ì¡Žì¬íì§ ìììµëë€.
죌êŽì ìŒë¡ ìŽ RFCê° ëëë €ì§ë©Ž ì€ì ê·ì¹ì "Ʞ볞ì ìŒë¡ Iterator
ì ìžíê³ ë stdì í¹ì±ì ì ë©ìë륌 ë£ì ì ììµëë€."ì
ëë€.
ëí ì€ì ì íì ìë¡ìŽ ë©ìë륌 ë£ì ìë ììµëë€. ëêµ°ê°ê° stdì ì íì ëíŽ "íì¥ í¹ì±"ì ê°ê³ ìë ìí©ì ê³ ë €íììì€. ìŽì stdë ìŽ ì íì ì€ì ë©ìëë¡ ì ê³µë íì¥ í¹ì± ë©ìë륌 구íí©ëë€. ê·žë° ë€ì ìŽê²ì ìì ì ëë¬íì§ë§ ìŽ ìë¡ìŽ ë°©ë²ì ì¬ì í ââêž°ë¥ íëê·ž ë€ì ììµëë€. ê·žë¬ë©Ž 컎íìŒë¬ë ìŽì 곌 ê°ìŽ íì¥ í¹ì±ì ë©ìë륌 ì ííì¬ ìì ì ìž ì»ŽíìŒë¬ìì ììì ìŒìŒí€ë ëì ë©ìëê° êž°ë¥ íëê·ž ë€ì ìê³ ìì ì ìž ë구 첎ìžê³Œ íšê» ì¬ì©í ì ìë€ê³ ë¶íí©ëë€.
ëí 죌목í ê°ì¹ê° ììµëë€. ìŽê²ì ëšì§ íì€ ëŒìŽëžë¬ëŠ¬ 묞ì ê° ìëëë€. ë©ìë ížì¶ 구묞ì ìíê³ì ê±°ì 몚ë ê³³ìì 죌ì ë³ê²œ ì¬íì ëì íë ê²ì íŒíë ê²ì ì ë§ ìŽë µê² ë§ëëë€.
(ë©í) ì¬êž° irlo ìì
#44438ìŽ ì ë¹íë€ë ë° ëìíë©Ž
볎ì¥í ì ì¶ íì곌 ê°ì ê²ìŽ ì€ì ë¡ XIBë¡ ë¬Žìë ì ìëì§ ì¬ê³ íŽìŒ í ìë ììµëë€.
íì¬ ì í ì¶ë¡ ë³ê²œì íì UFCS ëë ë€ë¥ž ë°©ë²ì ì¬ì©íì¬ ì íì ê°ì í ì ììŒë¯ë¡ RFC 1105 ë° 1122ìì íì©ëë ê²ìŒë¡ ê°ì£Œë©ëë€. ê·žë¬ë 컀뮀ëí° ë #42496( Ord::{min, max}
)ìŒë¡ ìží íìì ë³ë¡ ì¢ìíì§ ììµëë€ . ëí #41336( T += &T
ì 첫 ë²ì§ž ìë)ì 8ê°ì§ ì íì ì¶ë¡ íê·ë¡ ìžíŽ "ëšì§" ë«íìµëë€.
ë©ìë륌 ì¶ê°í ëë§ë€ ìŽëŠìŽ ìŽë¯ž ì¡Žì¬íì§ ìëì§ íìžíêž° ìíŽ ë¶íêµ¬ê° ììŽìŒ í©ëë€.
ê³ ì ë©ìë륌 ì¶ê°íë©Ž ì¶ë¡ ì€íšë ë°ìí ì ììµëë€. â #41793ì ë€ìŽì€ížëŠŒ ížë ìì ieee754::Ieee754::from_bits
ë©ìëì 충ëíë ê³ ì ë©ìë {f32, f64}::from_bits
ì¶ê°ë¡ ìžíŽ ë°ìíìµëë€.
ë€ìŽì€ížëŠŒ í¬ë ìŽížê° #![feature(clamp)]
ì§ì íì§ ìì ê²œì° í볎 Ord::clamp
ë ìŽê²ìŽ ê³ ì í ì룚ì
ìŽ ìë í ê³ ë €ëìŽìë ì ë©ëë€(믞ëì ížíëë ê²œê³ ê° ê³ì ë°íë ì ìì). ìŽë ê² íë©Ž "insta-breaking"ìŽ ìë ìë¡ìŽ í¹ì± ë°©ë²ì ëì
í ì ìì§ë§ ìì íëë©Ž 묞ì ê° ë€ì ë°ìí©ëë€.
ì¬ëë€ìŽ íì¥ í¹ì±ì ì ìíêž°ì 충ë¶íꞰ륌 ìíë ë©ìëê° íì€ ëŒìŽëžë¬ëŠ¬ì ì¶ê°ë ì ìë€ë©Ž ì°ëŠ¬ë ë§€ì° ëì ìì¹ì ìë ê² ê°ìµëë€.
ìµë/ìµìë ê³µíµ í¹ì±ì ê³µíµ ë©ìë ìŽëŠì ì¬ì©íë ê²ê³Œ êŽë šíì¬ í¹í ëì ì ì ëë¬íìµëë€. íŽëšíìë ëìŒíê² ì ì©í íìê° ììµëë€.
ëë ì¬ì í ê·žë ë€ê³ ë§íê³ ì¶ì§ë§ @sfackler ì°ëŠ¬ë ì ë§ ìŒë°ì ìŒë¡ ë€ìí ì íìŒë¡ 구íëë
ì 묞íê° ì€ë©Ž íì¥ í¹ì±ì íì¥ ë©ìë륌 ë£ìŽë ì묎 ê²ë ìì§ ììµëë€.
í ê°ì§ ì±ê°ì ë¶ë¶ì ìë¡ìŽ std ë©ìëê° ìœë륌 깚ëšëŠ¬ë©Ž ë¶ìì íêž° ë묞ì ì€ì ë¡ ì¬ì©í ì ìêž° íšì¬ ì ì ëíë ê²ì ëë€. ê·ž ìžìë ê°ì ì믞ì ë©ìëìì 충ëìŽëŒë©Ž ëìì§ ììµëë€.
íìì íŒíêž° ìíŽ ìŽ íšìì ë€ë¥ž ìŽëŠì ì§ì íë ê²ì ëì íŽê²°ì± ìŽëŒê³ ìê°í©ëë€. ìëíë ëì ìŽ êž°ë¥ì ì¬ì©íë 몚ë ìœëì í¥í ê°ë ì±ì ìµì ííë ëì ëª ê°ì í¬ë ìŽíž(몚ë ìŒê°ì ì í)륌 ê¹šì§ ìëë¡ ìµì ííê³ ììµëë€.
ëª ê°ì§ ê±±ì ê±°ëŠ¬ê° ìëë° ëª ê°ì§ë ê±±ì í íìê° ììµëë€.
ë³µí© ì í
BtreeSet<BtreeSet<impl Ord>>::range
ë§íŒ ìë¯žê° ìë€ê³ ìê°í©ëë€. ê·žë¬ë Vec<char>
ì ê°ìŽ ëììŽ ë ìë ìë í¹ì 겜ì°ê° ììµëë€.
ê°ì ìí ížì¶ 몚ë
ìŽê²ìŽ RFCì ëìì ë ëëµì ê·žë¥ use Cow ììµëë€.
ë¬Œë¡ ì€í 늬ì§ë¥Œ ì¬ì¬ì©íë €ë©Ž ë€ì 곌 ê°ì ì ììµëë€.
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 ìŽ ížì¶íêž°ì ìžì²Ž ê³µíì ìŒë¡ ë§ë€ ì ììµëë€.
libs íì ë©°ì¹ ì ë¶ë¥ 곌ì ìì ìŽì ëíŽ ë ŒìíìŒë©° ê²°ë¡ ì ìŽ ë³íì ëí ìíê³ ì ë°ì ê±žì³ ì€ëšìŽ 묎ììžì§ íìžíêž° ìíŽ ë¶í구륌 ì€ííŽìŒ íë€ë ê²ìŽììµëë€. ê·ž 결곌ë ì íí ìŽ ë¬žì ì ëíŽ ìŽë€ ì¡°ì¹ë¥Œ ì·šíŽìŒ íëì§ë¥Œ ê²°ì í©ëë€.
ì°ì ììê° ë®ì í¹ì±ìŽë íì¥ í¹ì±ì ë ë©ì§ ë°©ììŒë¡ ì¬ì©íë ê²ê³Œ ê°ìŽ API륌 ìœê² ì¶ê°íêž° ìíŽ ì¶ê°í ì ìë 믞ëì ìžìŽ êž°ë¥ìŽ ë§ìŽ ììµëë€. ê·žë¬ë ì°ëŠ¬ë ìŽì ê°ì ë°ì ìì ìŽê²ì ë°ëì ì°šëšíê³ ì¶ì§ë ììµëë€.
ìŽ êž°ë¥ì ëíŽ ë¶í구 ì€íìŽ ë°ìí ì ìŽ ììµëê¹?
#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
ê·žê² ë ë«ë€ê³ íëší걎 ìëì§ë§...
ë²ì ë°©ë²ìŒë¡ ì¬ì©íë ê²œì° ë€ë¥ž ìŽëŠì ì¬ì©í©ëë€.
몚ìì ìêŽììŽ ì¡°ë§ê° êž°ë¥ì ê°ì¶ë ê²ìŽ ì¢ì ê²ì ëë€.
íì¬ ìíë 묎ìì
ëê¹?
RangeInclusiveì íŽëší륌 ì¶ê°íë ê²ìŽ ë ëì ëììŽ ë ì ìë€ë í©ìê° ìë ê² ê°ìµëë€.
ê·žëì ëêµ°ê°ê° RFC륌 ìì±íŽìŒ í©ëê¹?
ìŽ ìì ììë ì 첎 RFCê° íìíì§ ìì ì ììµëë€. ìŽë€ ì² ì륌 ì íí ì§ ê²°ì íêž°ë§ íë©Ž ë©ëë€.
value.clamp(min, max)
(ìë ê·žëë¡ RFC ì€ì)value.clamp(min..=max)
(min..=max).clamp(value)
ìµì
2 ëë 3ì ì¬ì©íë©Ž ë¶ë¶ íŽëšíìŽ ë ì¬ìì§ëë€. í¹ë³í clamp_to_start
ëë clamp_to_end
ë©ìë ììŽ value.clamp(min..)
ëë value.clamp(..=max)
ì ìíí ì ììµëë€.
@egilburg : ì°ëŠ¬ë ìŽë¯ž í¹ë³í ë©ìë륌 ê°ì§ê³ ììµëë€: clamp_to_start
ë max
ìŽê³ clamp_to_end
ë min
.
ê·žëë ꟞ì€íšìŽ ì¢ìµëë€.
@egilburg Rustë ì§ì ì€ë²ë¡ë©ì ì§ìíì§ ììµëë€. ìµì
2ê° ê·íì ì ì곌 íšê» ìëíë €ë©Ž RangeInclusive
, RangeToInclusive
ë° RangeFrom
ëíŽ êµ¬íë ìë¡ìŽ í¹ì±ìŽ íìíë©°, ìŽë ìë¹í ë¬Žê±°ìŽ ëëì
ëë€.
ì ë 3ë²ìŽ ê°ì¥ ì¢ì ì íìŽëŒê³ ìê°í©ëë€.
1 ëë 2ê° ê°ì¥ ë ëëìµëë€. ë§ì ìœëê° ë¡ì»¬ 구íì íì€ êµ¬íìŒë¡ ë첎íêž° ìíŽ í ìŒìŽ ì êž° ë묞ì 1ì ì ì§í©ëë€.
ëë ì°ëŠ¬ê° _all_ range* ì íì ì¬ì©íê±°ë _none_ ê·ž ì€ íë륌 ì¬ì©íëë¡ ê³ííŽìŒ íë€ê³ ìê°í©ëë€.
ê°ì ê²ë€ì ëí ë ìŽë µ ë¬Œë¡ ,ì Range
ë³Žë€ RangeInclusive
. íì§ë§ (0.0..1.0).clamp(2.0_f32)
=> 0.99999994_f32
ëíŽ ì¢ì ì ìŽ ììµëë€.
@kennytm ê·žëì ìµì
3ìŒë¡ í 늬íì€ížë¥Œ ìŽë©Ž ë³í©ë ê²
ëë ììŒë¡ ìŽë»ê² ì§ííŽìŒ íë€ê³ ìê°íìëê¹?
@EdorianDark ìŽë¥Œ ìíŽ @rust-lang/libsì 묞ìíŽìŒ í©ëë€ ð
ì ë ê°ìžì ìŒë¡ RangeInclusive
ë§ ìë ìµì
2륌 ì¢ìí©ëë€. ìžêží ë°ì ê°ìŽ min
ë° max
"ë¶ë¶ íŽëší"ìŽ ìŽë¯ž ì¡Žì¬í©ëë€.
ëë @SimonSapinì ëìíì§ë§ ìµì 1ë êŽì°®ì ê²ì ëë€. ìµì 3ì ì¬ì©íë©Ž ê±°êŸžë¡ ë³ŽìŽêž° ë묞ì êž°ë¥ì ì¬ì©íì§ ìì ê²ì ëë€. @kennytmìŽ ìŽì ì
íŽëšíë ìŽì ë€ì ë§ì€í°ì ëë€!
êž°ìê² ìê°í©ëë€. íì§ë§ #44097ìë ììì§ë§ ì§êžì 묎ììŽ ìŽê²ì ë°ìë€ìŒ ì ìê² ëìëì§ ìì ëŽë €ê³ ë žë ¥íê³ ììµëë€.
ìŽì ìì íëêž° ì ìë ìŠì ì¶ë¡ ì 깚ë ëì #48552ë¡ ìží ê²œê³ êž°ê°ìŽ ììµëë€.
ì¢ì ììì ëë€. ê°ì¬í©ëë€!
@kennytm #48552 륌 ë§ë€êž° ìíŽ í ë žë ¥ì ê°ì¬ 죌ìê³ êµ¬ííŽ ì£Œì ì ê°ì¬í©ëë€. ìŽê²ìŽ ë§ì¹šëŽ ë³í©ëë ê²ì 볎ë ê²ì íë¥í©ëë€.
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]
ìŽê²ìŽ íŽëší 구íì ëŽì¬ë ê²ì ëê¹, ìëë©Ž LLVM ìµì íì êž°ìŽí ê²ì ëê¹?
@kornelski clamp
NAN
륌 ì¬ì©íë©Ž NAN
ì 볎졎íŽìŒ íë©° max
/ min
ë묞ì max
maxmined
ë 볎졎íì§ ììµëë€ min
ë _non_- NAN
볎졎í©ëë€.
NAN êž°ëì¹ë¥Œ 충족íê³ ë 짧ì 구íì ì°Ÿë ê²ìŽ ì¢ìµëë€. ê·žëŠ¬ê³ doctestê° NAN ì²ëŠ¬ë¥Œ 볎ì¬ì£Œë ê²ìŽ ì¢ì ê²ì ëë€. ìë PRì ë€ì곌 ê°ì ëŽì©ìŽ ììë ê² ê°ìµëë€.
@scottmcm https://github.com/rust-lang/rust/pull/59327 ìë£
min ëë maxê° NaNìž ê²œì° íŽëšíìŽ íšëì ìŒìŒí€ë ìŽì ë 묎ìì
ëê¹? ëë ìŽì€ì
ì assert!(min <= max)
ìì assert!(!(min > max))
ë¡ ë³ê²œíì¬ ìµë ë° ìµì ë°©ë²ê³Œ ë§ì°¬ê°ì§ë¡ NaN ìµìê° ëë ìµëê°ìŽ ìí¥ì 믞ì¹ì§ ìëë¡ í©ëë€.
íŽëšíì min
ëë max
ì ëí NANì íë¡ê·žëë° ì€ë¥ë¥Œ ëíëŽë ê²ìŒ ì ììŒë©°, íŽëšíëì§ ìì ë°ìŽí°ë¥Œ IOì ì ê³µíë ê²ë³Žë€ ë 빚늬 íšëì ë¹ ì§ë ê²ìŽ ë«ë€ê³ ìê°íìµëë€. ìí ëë ííì ìíì§ ìëë€ë©Ž ìŽ êž°ë¥ì ì í©íì§ ììµëë€.
ìí ëë ííì ìíì§ ììŒë©Ž íì INF ë° -INF륌 ì¬ì©í ì ììµëë€. NaN곌 ë¬ëŠ¬ ìíì ìŒë¡ë ìë¯žê° ììµëë€. ê·žë¬ë ëë¶ë¶ì ê²œì° max
ë° min
륌 ì¬ì©íë ê²ìŽ ì¢ìµëë€.
@Xaerox 구ííŽì£Œì ì ê°ì¬í©ëë€.
ìŽê²ìŽ ìì ì ìž ìœë륌 깚ëšëŠŽ ê²œì° ë€ì ë²ì ì ì ì©ë ì ììµëê¹?
IMOê° ë ììží ê³ ë €í ê°ì¹ê° ìë í ê°ì§ë f32
/ f64
ìŒë°©ì íŽëšíì
ëë€. í ë¡ ì ìŽ ì£Œì ì ëíŽ ê°ëµíê² ë€ë£¬ ê² ê°ì§ë§ ì€ì ë¡ë ììží ê³ ë €íì§ ìììµëë€.
ëë¶ë¶ì ê²œì° ëšìž¡ íŽëšíì ëí ì
ë ¥ìŽ NANìŽë©Ž ê²°ê³Œê° íŽëší 겜ê³ê° ëë ê²ë³Žë€ ê²°ê³Œê° NANìž ê²ìŽ ë ì ì©í©ëë€. ë°ëŒì êž°ì¡Ž f32::min
ë° f64::max
íšìë ìŽ ì¬ì© ì¬ë¡ìì ì ëë¡ ìëíì§ ììµëë€. ížìž¡ íŽëšíì ìí ë³ëì êž°ë¥ìŽ íìí©ëë€. (rust-num/num-traits#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ì ì ííŽìŒ íë©°, ìŽë ì벜íê² í©ëŠ¬ì ìŽëŒê³ ìê°í©ëë€. ëë IMOê° ë묎 ì¥í©í ìµì
3ì
ëë€. ì°ëŠ¬ë í¬ììŽ ë³ëì clamp_min
ë° clamp_max
íšì륌 ì¶ê°íê±°ë ì¬ì©ìê° ìì/ìì 묎íë륌 ìì±íëë¡ ì구íë€ë ê²ì ìê³ ììŽìŒ í©ëë€.
ì ê³µí ì ìë€ë ì ë 죌목í ê°ì¹ê° ììµëë€.
impl f32 {
pub fn clamp<T>(self, bounds: T) -> f32
where
T: RangeBounds<f32>,
{
// ...
}
}
// and for f64
f32
/ f64
ê²œì° ìŒë° Ord
ì ë¬ëŠ¬ ë°°íì ë²ì륌 ì²ëŠ¬íë ë°©ë²ì ì€ì ë¡ ìê³ ìêž° ë묞ì
ëë€. ë¬Œë¡ ìŒêŽì±ì ìíŽ RangeInclusive
ìžì륌 ì¬ì©íëë¡ Ord::clamp
륌 ë³ê²œíê³ ì¶ì ê²ì
ëë€. Ord::clamp
ëíŽ ë ê°ì ìžì ëë ëšìŒ RangeInclusive
ìžì륌 ì íží ì§ ì¬ë¶ì ëíŽ ìŽë 쪜ìŽë ê°ë ¥í ìê²¬ìŽ ììë ê² ê°ìµëë€.
ìŽ ë¬žì ê° ìŽë¯ž íŽê²°ë ê²œì° ìžì ë ì§ ëŽ ì견ì 묎ìíììì€. ëë ìŽì í ë¡ ìì ê·žê²ë€ì ë³Žì§ ëª»íêž° ë묞ì ìŽë¬í ê²ë€ì 꺌ëŽê³ ì¶ììµëë€.
ë¶ë¥: ìë APIë íì¬ ë¶ìì íë©° ì¬êž°ë¥Œ ê°ëŠ¬íµëë€. NaN ì²ëŠ¬ ìžì ê³ ë €íŽìŒ í 묞ì ê° ììµëê¹? NaN ì²ëŠ¬ìì ì°šëšíì§ ìê³ ëšŒì Ord::clamp
ìì íí ê°ì¹ê° ììµëê¹?
```ë
¹
í í¹ì± Ord: Eq + PartialOrd
// âŠ
fn clamp(self, min: Self, max: Self) -> Self where Self: Size {âŠ}
}
impl f32 {
pub fn clamp(self, min: f32, max: f32) -> f32 {âŠ}
}
impl f64 {
pub fn clamp(self, min: f64, max: f64) -> f64 {âŠ}
}
@SimonSapin ê°ìžì ìŒë¡ 몚ë ê²ì ìì íììŒ êž°ì©ëë€.
+1, ìŽê²ì ì 첎 RFC륌 ê±°ì³€ìŒë©° ê·ž ìŽíë¡ ëìš ìë£ê° ìë€ê³ ìê°í©ëë€. ì륌 ë€ìŽ NaN ì²ëŠ¬ë IRLO ë° RFC í ë¡ ìì ììží ì€ëª ëììµëë€ .
ì¢ì, 충ë¶í ê³µííê² ë€ëŠ°ë€.
@rfcbot fcp ë³í©
íì @SimonSapin ìŽ ìŽë¥Œ ë³í©í ê²ì ì ìíìµëë€. ë€ì ëšê³ë íê·žê° ì§ì ë ëëšžì§ íììŽ ê²í íë ê²ì ëë€.
íì¬ ëìŽë ì°ë € ì¬íìŽ ììµëë€.
곌ë°ìì ê²í ìê° ì¹ìžíë©Ž(ìµë 2ê°ì ì¹ìžìŽ ëšì ìì) ìµì¢ ì견 ìë Ž êž°ê°ìŽ ììë©ëë€. ìŽ íë¡ìžì€ì ìŽë ìì ììë ì êž°ëì§ ìì 죌ì 묞ì 륌 ë°ê²¬íë©Ž ìë €ì£Œìžì!
íê·žê° ì§ì ë í 구ì±ììŽ ëìê² ì€ ì ìë ëª ë ¹ì ëí ì 볎ë ìŽ ë¬žì 륌 ì°žì¡°íììì€.
x.clamp(7..=13)
vs x.clamp(7, 13)
ëí ê²°ì ìŽ ëŽë €ì¡ìµëê¹? https://github.com/rust-lang/rust/issues/44095#issuecomment -533764997 ì 첫 ë²ì§ž ê²ìŽ ì ì¬ì ìž ë¯žë f64::clamp
ìì ìŒêŽì±ì ìíŽ ë ëì ì ìë€ê³ ìžêží©ëë€.
@m-ou-se https://github.com/rust-lang/rust/issues/44095#issuecomment -411457313 ë° ì°žì¡° íìžì. 58710#pullrequest늬뷰 -207529970.
.min
ë° .max
.min(...)
륌 ì¬ì©íì¬ ìíì ì§ì íê³ .max(...)
륌 ì¬ì©íì¬ ìíì ì§ì í ë ë²ê·žê° ì죌 ë°ìíë¯ë¡ ìŽë ìë¹í ë¶íí íŽê²°ìŽëŒê³ ë§íê³ ì¶ìµëë€. íí. ìŽê²ì 믿ì ì ìì ì ëë¡ íŒëì€ëœê³ ëë ìŽê²ìŒë¡ ë§ì ë²ê·žë¥Œ 볎ììµëë€. .clamp(..1.0)
ë° .clamp(0.0..)
ê° íšì¬ ë ëª
íí©ëë€.
@CryZe ë ë§€ì° ì¢ì ì§ì ì í©ëë€. min = upper bound, max = lower bound ë¡ ì€ì륌 íì§ ìëëŒë ìŽë€ ê²ì ì¬ì©íŽìŒ íëì§ êž°ìµíêž° ìíŽ ì¬ì í ì ì 첎조륌 íŽìŒ í©ëë€. ìŽ ìžì§ ë¶íë íŽê²°íë €ë 묞ì ì ë ì ì¬ì©ë©ëë€.
x.clamp(y, z)
ê° ë êž°ëëë€ë ê²ì ìê³ ìì§ë§ ìë§ë ìŽê²ìŽ íì ì êž°íìŒ ê²ì
ëë€ ;)
ëë ìŽêž° ëšê³ìì ë²ì륌 ꜀ ë§ìŽ ì€ííê³ í¬êŽì ìž ë²ì륌 ì€íí ì ìëë¡ RFC륌 ëª ê°ì ì§ì°ìí€êž°ê¹ì§ íìµëë€. (ìŽê²ì ìì íëêž° ì ì ììëììµëë€)
ë¶ë ììì ì«ìì ëí ë ì ë²ìì ëí íŽëší륌 구íí ì ìë€ë ê²ì ë°ê²¬íìµëë€. ìŒë¶ ë²ì ì íë§ ì§ìíê³ ë€ë¥ž ì íì ì§ìíì§ ìë ê²ì ë묎 ëëŒìŽ 결곌ììµëë€. ê·žëì RFC륌 ìŽë¬í ë°©ììŒë¡ ì€ííêž° ìíŽ ëª ë¬ì ì°êž°íì§ë§ ê¶ê·¹ì ìŒë¡ ë²ìê° ì룚ì ìŽ ìëëŒê³ ê²°ì íìµëë€.
@m-ou-se #44095(ëêž) ë° #58710(늬뷰)ìì ììíë í ë¡ ì ì°žì¡°íìžì.
ížì§: ìëìì ì§ì í ë°ì ê°ìŽ í 늬íì€íž(#58710)ì ë Œììë ì¶ì 묞ì ë³Žë€ ì€ê³ ê²°ì ì ëí ë ë§ì ë Œìê° í¬íšëìŽ ììµëë€. ìŽê²ìŽ ìŒë°ì ìŒë¡ ëììž í ë¡ ìŽ ìŽë£šìŽì§ë ê³³ìž ì¬êž°ìì ì ë¬ëì§ ìì ê²ìŽ ì ê°ìŽì§ë§ í ë¡ ëììµëë€.
ìŒë¶ ë²ì ì íë§ ì§ìíê³ ë€ë¥ž ì íì ì§ìíì§ ìë ê²°ê³Œê° ë묎 ëëìµëë€.
Rustë ìŽë¯ž ìŒë¶ ë²ì륌 ë€ë¥ž ë²ìì ë€ë¥Žê² ì·šêžíë¯ë¡(ì: ë°ë³µì ìíŽ ì¬ì©) ìŒë¶ ë²ìë§ 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
@Xaerox륌 ìì íìµëë€. :)
ìê°ê³Œ ìŒë°ì ìž ì¬ì©ë²ìŽ ê·íì ì견ì ë°êŸžììµëë€
ì§êžê¹ì§ë ê·žë ì§ ììì§ë§ ë²ìë ìŒìì ìž ìœë©ìì ê±°ì ì¬ì©íì§ ìë ê²ì
ëë€. ìœë ìì ì ë¶ë¶ ë²ì ì§ììŽ í¬íšë êž°ì¡Ž API륌 íµíŽ ì€ëí ì ììµëë€. ê·žë¬ë ì°ëŠ¬ê° ê·ž ì§ë¬žì íŽê²°íëëŒë scottmcmìŽ RFC 죌ììì íŽê²°íŽìŒ í ëª ê°ì§ ë€ë¥ž ì°ìí ì ìŽ ì¬ì í ììµëë€. ì륌 ë€ìŽ, Step
ë Ord
ë§íŒ ë§ì ì íìì 구íëì§ ììµëë€. ìŽ ì¬ìí 구묞 ë³ê²œìŽ íŽë¹ ì íì ìì ê°ì¹ê° ììµëê¹? ëí ë¹í¬íš ë²ì íŽëšíì ëí ì¬ì© ì¬ë¡ê° ììµëê¹? ëŽê° ë§í ì ìë í, ë€ë¥ž ìžìŽë íë ììí¬ë ë°°íì ë²ì íŽëší륌 ì§ìí íì륌 ëëŒì§ ìììµëë€. ê·žë¬ë©Ž ì°ëŠ¬ê° ì»ì ì ìë ìŽì ì 묎ìì
ëê¹? ë²ìë ë§ì¡±ì€ë¬ìŽ ë°©ììŒë¡ 구ííêž°ê° íšì¬ ë ìŽë €ì ìŒë©° ë§ì ëšì 곌 ì ì ìŽì ìŽ ìììµëë€.
ë²ì륌 ì¬ì©íì¬ ìŽê²ì 구í íë€ë©Ž ë€ì곌 ê°ìŽ ë³ŽìŒ ê²ì ëë€.
ë°ëŒì ìŽ ì ê·Œ ë°©ìì ì¬ì©íŽìë ì ëë€ê³ ìê°íë ëª ê°ì§ ìŽì ê° ììµëë€.
íìí ë²ì ì íì ìë¡ìŽ í¹ì±ìŽ íìí ë§íŒ 충ë¶í ì°žì íë©° í¹í ê°ì¥ ìŒë°ì ìž ë²ììž Range
ì ìží©ëë€.
ì°ëŠ¬ë ìŽë¯ž RFC íë¡ìžì€ìì ì¬êž°ê¹ì§ ìê³ ìŽê²ìŒë¡ë¶í° íì€ìŽ ì»ë ì ìŒí ê²ì .max()
ëë .min()
륌 ìì±íë ë ë€ë¥ž ë°©ë²ì
ëë€. ëë ì°ëŠ¬ê° ìŽë¯ž Rustìì í ì ìë ê²ì 구ííêž° ìíŽ RFC륌 íë¡ìžì€ì ìì ë¶ë¶ìŒë¡ ëëëŠ¬ê³ ì¶ì§ ììµëë€.
ìì§ ì¡Žì¬íëì§ íì€íì§ ìì ì¬ì© ì¬ë¡ë¥Œ ìì©íêž° ìíŽ íšììì ë°ìíë ë¶êž°ì ìì ë ë°°ë¡ ë늜ëë€. ìŽê²ì ë²€ì¹ë§í¬ì íìí ì ììµëë€.
... ìŽê²ìì íì€ìŽ ì»ë ì ìŒí ê²ì
.max()
ëë.min()
륌 ì°ë ë ë€ë¥ž ë°©ë²ì ëë€.
ëŽê° ë§íë €ê³ íë 죌ì ìì ì í ë¡ ìì .min()
/ .max()
곌 ìŒë°©ì íŽëšíê° ì¬ë¬ ë² ëíëë ëª
ë°±í ëë±ì±ì 볎ìì§ë§ ìì
ì ëìŒíì§ ìë€ë ê²ì
ëë€. ë¶ë ììì ì«ìì ê²œì° NAN
ì²ëŠ¬íŽìŒ í©ëë€.
ì륌 ë€ìŽ ìì륌 0ìŒë¡ ê³ ì íë ííììŒë¡ input.max(0.)
륌 ê³ ë €íììì€. input
ê° NAN
ìŽ ìë ê²œì° ì ëë¡ ìëí©ëë€. ê·žë¬ë input
ê° NAN
ìŽë©Ž 0.
íê°ë©ëë€. ìŽê²ì ê±°ì ìíë ëììŽ ìëëë€. í쪜 íŽëšíì NAN
ê°ì ì ì§íŽìŒ í©ëë€. ( ìŽ ì£Œì ë° ìŽ ì£Œìì ì°žì¡°íììì€.) ê²°ë¡ ì ìŒë¡ .max()
ë ë ì«ì ì€ ë í° ì«ì륌 ì·šíë ë°ë ì ìëíì§ë§ ëšìž¡ íŽëšíìë ì ìëíì§ ììµëë€.
ë°ëŒì ë¶ë ììì ì«ìì ëíŽ ëšìž¡ íŽëší ìì
( .min()
/ .max()
ì ë³ë)ìŽ íìí©ëë€. ë€ë¥ž ì¬ëë€ì ë¶ë ììì ìŽ ìë ì íì ëí ëšìž¡ íŽëší ìì
ì ì ì©ì±ì ëíŽìë ì¢ì ì£Œì¥ ì íìµëë€. ë€ì ì§ë¬žì ìŽë¬í ìì
ì íííë ë°©ë²ì
ëë€.
.clamp()
ì INFINITY
ìŠ, ìŒë°©ì ìž íŽëší ìì
ì ì¶ê°íì§ ë§ììì€. ì¬ì©ììê² INFINITY
ëë NEG_INFINITY
겜ê³ì íšê» .clamp()
륌 ì¬ì©íëë¡ ì§ìíìžì. ì륌 ë€ìŽ, ì¬ì©ììê² input.clamp(0., std::f64::INFINITY)
륌 ìì±íëë¡ ì§ìíììì€.
ìŽê²ì ë§€ì° ì¥í©íì¬ ì¬ì©ìê° NAN
ì²ëŠ¬ì ëìì€ë¥Œ ìì§ ëª»íë ê²œì° ì못ë .min()
/ .max()
í©ëë€. ëí T: Ord
ìë ëììŽ ëì§ ììŒë©° IMOë ëìë³Žë€ ëª
ííì§ ììµëë€.
.clamp_min()
ë° .clamp_max()
í ê°ì§ í©ëŠ¬ì ìž ìµì
ì íì¬ ì ìë 구íì ë³ê²œí íìê° ìë .clamp_min()
ë° .clamp_max()
ë©ìë륌 ì¶ê°íë ê²ì
ëë€. ëë ìŽê²ìŽ í©ëŠ¬ì ìž ì ê·ŒìŽëŒê³ ìê°í©ëë€. íì¬ ì ìë clamp
구íì ìì ííë €ë©Ž ìŽ ì ê·Œ ë°©ìì ì¬ì©íŽìŒ íë€ë ì¬ì€ì ìê³ ì¶ììµëë€.
ë ë€ë¥ž ìµì
ì clamp
ê° ë²ì ìžì륌 ì¬ì©íëë¡ íë ê²ì
ëë€. @Xaeroxe ë ìŽê²ì 구ííë í ê°ì§ ë°©ë²ì ë³Žì¬ ì£Œìì§ë§ ê·žê° ìžêží ê²ì²ëŒ 구íìë ëª ê°ì§ ëšì ìŽ ììµëë€. 구íì ìì±íë ë€ë¥ž ë°©ë²ì íì¬ ì¬ëŒìŽì±ìŽ 구íë ë°©ì곌 ì ì¬í©ëë€( SliceIndex
í¹ì±). ìŽë ê² íë©Ž ë²ì ì íì íì ì§í©ê³Œ ì¶ê° ë³µì¡ì±ì ëí 구íì ì ê³µíë ê²ì ëí ì°ë €ë¥Œ ì ìžíê³ í ë¡ ìì 볞 몚ë ìŽìê° íŽê²°ë©ëë€. ëë ê·žê²ìŽ ìœê°ì ë³µì¡ì±ì ì¶ê°íë€ë ë° ëìíì§ë§ IMOë .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)
}
}
ìíë ê²œì° ëì€ì f32
/ f64
ë
ì ë²ìì ëíŽ Clamp
륌 구íí ì ììµëë€. ( @scottmcm ì std
ìëì ìŒë¡ f32
/ f64
ì í ìì
ìŽ ìêž° ë묞ì ìŽê²ìŽ ê°ëšíì§ ìë€ê³ ìžêžíìµëë€. ì std
ìžì§ ì ëªšë¥Žê² ìµëë€. ìë íŽë¹ ìì
ìŽ ììµëë€. ë¹ì ê· ì«ìì 묞ì ê° ìì ì ììµëê¹? ê·žëŒìë ë¶êµ¬íê³ ëì€ì íŽê²°í ì ììµëë€.)
f32
/ f64
ë°°íì ë²ìì ëíŽ Clamp
구íì ì¶ê°íì§ ìëëŒë ìŽê²ìŽ ë묎 ëëë€ë ë° ëìíì§ ììµëë€. @varkorê° ì§ì íë¯ìŽ Rustë ìŽë¯ž Copy
ë° Iterator
/ IntoIterator
목ì ìŒë¡ ë€ìí ë²ì ì íì ë€ë¥Žê² ì·šêží©ëë€. (IMO, ìŽê²ì std
ì ì¬ë§ê·ì§ë§ ë²ì ì íìŽ ë€ë¥Žê² ì²ëŠ¬ëë 겜ì°ê° íë ìŽì ììµëë€.) ëí ëêµ°ê°ê° ëšë
ë²ì륌 ì¬ì©íë €ê³ íë©Ž ì€ë¥ ë©ìì§ë¥Œ ìŽíŽíêž° ì¬ìž ê²ì
ëë€( "í¹ì± ê²œê³ std::ops::Range<f32>: Clamp<f32>
ê° ì¶©ì¡±ëì§ ììµëë€.").
ììŒë¡ ë ë§ì 구íì ì¶ê°í ì ìëë¡ ì ì°ì±ì ìµëííêž° ìíŽ Output
êŽë š ì íì ë§ë€ìì§ë§ êŒ íìí ê²ì ìëëë€.
Ʞ볞ì ìŒë¡ ìŽ ì ê·Œ ë°©ìì í¹ì± 겜ê³ì êŽë šíì¬ ìíë ë§íŒì ì ì°ì±ì ì ê³µí©ëë€. ëí ìµìíì ì ì©í Clamp
구í ìžížë¡ ììíì¬ ë³ê²œ ì¬íì ì€ëšíì§ ìê³ ëì€ì 구íì ì¶ê°í ì ììµëë€.
"ì¬ì© .clamp()
ì INFINITY
"ììì ìžêž í ë°ì ê°ìŽ ì ê·Œ ë°©ìì ìë¹í ëšì ìŽìë€.
"êž°ì¡Ž .clamp
" + .clamp_min()
+ .clamp_max()
ì ê·Œ ë°©ììë ë€ì곌 ê°ì ëšì ìŽ ììµëë€.
input.clamp_min(0)
ëì input.clamp(0..)
..clamp()
구íì ë ì¶ê°í ì ììµëë€(ìì§ ë ë§ì ë©ìë륌 ì¶ê°íì§ ìê³ ). ì륌 ë€ìŽ, ì°ëŠ¬ë RFC í ë¡ ìì ìì²ë êž°ë¥ìž u8
겜ê³ë¡ u32
ê°ì ê³ ì íë ê²ì ì§ìí ì ììµëë€. ê·ž í¹ì ìë .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
ìì§ íì€íì§ ìì ì¬ì© ì¬ë¡ë¥Œ ìì©íêž° ìíŽ íšììì ë°ìíë ë¶êž°ì ìì ë ë°°ë¡ ë늜ëë€.ìŽê²ì ë²€ì¹ë§í¬ì íìí ì ììµëë€.
ì¶ê° ë¶êž°ê° LLVMì ìíŽ ìµì íë ì ììµëê¹?
í쪜 íŽëší ì
íŽëšíì ì쪜 몚ë륌 í¬íšíêž° ë묞ì ìŒìªœ/ì€ë¥žìªœì ìµì/ìµë륌 ì§ì íë©Ž íìªœë§ íŽëší ëìì ì»ì ì ììµëë€. ëë ê·žê²ìŽ ì벜íê² ìì© ê°ë¥íê³ Range*
ì íìŽ ìŽìšë ë§ë .clamp((Bound::Unbounded, Inclusive(3.2)))
ë³Žë€ í늌ììŽ ë ë«ë€ê³ ìê°í©ëë€.
x.clamp(i32::MIN, 10);
x.clamp(-f32::INFINITY, 10.0);
LLVMì 죜ì ë©Žì ìµìíí ì ììŒë¯ë¡ ì±ë¥ ìì€ìŽ ììµëë€. https://rust.godbolt.org/z/l_uBLO
ë²ì 구묞ì ë©ì§ì§ë§ clamp
ë Ʞ볞ì ìŒë¡ ë ê°ì ê°ë³ ìžìê° íë¥íê³ ìŽíŽíêž° ìœìµëë€.
min
/ max
NaN
ì²ëŠ¬ë ì첎ì ìŒë¡ ìì ë ì ììµëë€. ì륌 ë€ìŽ f32
ì ê³ ì í ë©ìë 구íì ë³ê²œíë©Ž ë ê¹ì? ëë PartialOrd::min/max
ì 묞í ? (Rustê° libstdìì í목ì í êžíë ë°©ë²ì ì°Ÿì ì ìë€ê³ ê°ì íë©Ž ìëì
íë귞륌 ì¬ì©íì¬).
@scottmcm ë¹ì ì ì²Ží¬ ììíŽìŒ RangeToInclusiveì .
ìŽê²ì ì¢ ë ìê°í íì ìì ì ììíë€ë ìê°ìŽ ë€ììµëë€. ê·žëì ì°ëŠ¬ë "RFC íë¡ìžì€ ì¬ì€ì "ì ë³ê²œíì§ ìë ìŽì ë¡ ê°ì£ŒíŽìë ìë©ëë€.
ìŽë¥Œ ìíŽ ì ë ìŽê²ì 구íí ëì ë§ìžëë¡ ëìê°ê³ ì¶ìµëë€. Clampë ê°ë ì ìŒë¡ ë²ìì ëíŽ ìëíë¯ë¡ ë²ì륌 íííêž° ìíŽ Rustê° ìŽë¯ž ì¬ì©íê³ ìë ìŽí륌 ì¬ì©íë ê²ìŽ ì¢ìµëë€. ëŽ ë¬ŽëŠ ê²œë š ë°ììŽìê³ , ë€ë¥ž ë§ì ì¬ëë€ì ë°ììž ê² ê°ë€. ê·žëì ìŽë° ììŒë¡ íì§ ìë ê²ì ëí 죌ì¥ì ë€ì ë°ë³µíê³ ì°ëŠ¬ê° ê·žê²ë€ì ë Œë°í ì ìëì§ ëŽ ìë€.
íìí ë²ì ì íì ìë¡ìŽ í¹ì±ìŽ íìí ë§íŒ 충ë¶í ì°žì íë©° í¹í ê°ì¥ ìŒë°ì ìž ë²ììž Range
ì ìží©ëë€.
Ord + Step
ì ê°ì í¹ì Range*
ì íì ëí ì íì ë ì¶ê°í ì ììµëë€. ë°ëŒì ë°°íì ë²ì íŽëšíê° ì€ì ë¡ íìíì§ ìì 겜ì°ê° ë§ì§ë§ ìŽë¬í êž°ì ì ì íìŽ ìë ë²ìì ìží°íìŽì€ë¥Œ ìììí€ì§ ììŒë©Žì ì¬êž°ìì ì 첎 ë²ì륌 ì€ì ë¡ ìì©í ì ììµëë€.ëšë©Ž íŽëšíì Infinity/Min/Max륌 ì¬ì©í ì ììµëë€.
Range*
êµ¬ë¬žìŽ ìŽ ì¬ì© ì¬ë¡ì ëíŽ ë ì ì ìì 묞ìì ë ì ì ìì ê°ì žì€êž°ë¥Œ í¬íšíë€ë ê²ì
ëë€.ìŽë ê² íì§ ìë ìŽì 륌 ë°ë°íìŒë¯ë¡ ìŽ ì견ìë ìµì
ìŽ ëìŒíŽ 볎ìŽêž° ë묞ì ë³ê²œíë €ë ëêž°ê° ì í ììµëë€. ë³íì ëꞰ륌 ì°ŸìëŽ
ìë€. ëŽê° ê°ì§ ìŽì ë ëš íëì
ëë€. ìŽ ì€ë ëì ìŒë°ì ìž ì견ì ë²ì êž°ë° ì ê·Œ ë°©ììŽ ìžìŽì ì믞 첎ê³ë¥Œ ê°ì íë€ë ê²ì
ëë€. í¬êŽì ìž ìŽì€ ì¢
ë£ ë²ì íŽëšíë¿ë§ ìëëŒ .min()
ë° .max()
ì ê°ì íšììë ì ì©ë©ëë€.
ìŽ ìê°ìŽ RFC륌 ìë ê·žëë¡ ìì ííë ë° ì°¬ì±íë ë€ë¥ž ì¬ëë€ìê² ìŽë€ 견ìžë ¥ìŽ ìëì§ ê¶êží©ëë€.
ìŽì ë€ë¥ž ìžìŽì ë§€ì° ì ì¬íêž° ë묞ì Clamp륌 íì¬ ííë¡ ëë ê²ìŽ ë ì¢ì ê²ìŽëŒê³ ìê°í©ëë€.
pull request #58710 ìì
ì í ë Range êž°ë° êµ¬íì ì¬ì©íë €ê³ íìµëë€.
ê·žë¬ë rust-lang/rfcs#1961 (comment) ) íì€ íììŽ ë ë«ë€ê³ íì íìµëë€.
Rust ì«ìê° ìŽë»ê² ìëíëì§ ìµìíì§ ìì ì¬ëë€ì íŒëíì§ ìëë¡ íšìì #[must_use]
ìì±ì ê°ë ê²ìŽ ë
ŒëŠ¬ì ìŽëŒê³ ìê°í©ëë€. ìŠ, ë€ì(ì못ë) ìœë륌 ìì±íë ì¬ëì ìœê² ê°ì§í ì ììµëë€.
let mut x: f64 = some_number_source();
x.clamp(0.0, 1.0);
//Proceeds to assume that 0.0 <= x <= 1.0
ìŒë°ì ìŒë¡ Rustë ì«ìì ëíŽ (number).method()
ì ê·Œ ë°©ìì ì·šíì§ë§(ë€ë¥ž ìžìŽììë Math.Method(number)
륌 ì¬ì©íì§ë§) ìŽê²ì ìŒëì ëëëŒë ìŽê²ìŽ number
ìì í ì ìë€ë ë
ŒëŠ¬ì ê°ì ìŽ ë©ëë€.
[must_use]
ìì±ìŽ ìµê·Œ ì ì¶ê°
@ Xaerox ë²ì êž°ë° íŽëšíì ëíŽ ìê°íŽ ëž ê²ìŽ ììµëê¹?
ì§êž ìŽëë¡ì íšìê° ë
¹ì ë€ë¥ž ìì¹íšìì ê°ì¥ ì ë§ëë€ê³ ìê°íê³ ë€ì ìì í륌 ììíê³ ì¶ìµëë€.
íì¬ë¡ìë ë²ì êž°ë° íŽëší륌 ì¬ì©í ìŽì ê° ììµëë€. ì, must_use ìì±ì ì¶ê°íê³ ìì í륌 ìíŽ ë žë ¥íê² ìµëë€.
@SimonSapin @scottmcm ìì í íë¡ìžì€ë¥Œ ë€ì
@jturner314ê° ë§íë¯ìŽ Ord ëì PartialOrdì íŽëší륌 ì¬ì©íë©Ž íë¡ížììë ì¬ì©í ì ììµëë€.
ìŽ ížìë ìŽë¯ž 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
ë float ì ì© í¹ì±ìŽ ìëëë€. float ì ì© ë©ìë륌 ì¬ì©íë©Ž ì¬ì©ì ì ì PartialOrd
ì íì íŽëší륌 ì¬ì©í ì ììµëë€.
íì¬ êµ¬íìë Eq
ê° íìíì§ë§ ì¬ì©íì§ ììµëë€.
PartialOrd
ì 죌ì êŽì¬ì¬ë ë ìœí 볎ìŠì ì ê³µíì¬ íŽëšíì 볎ìŠì ìœíìíšë€ë ê²ì
ëë€. ìŽê²ìŽ PartialOrd
ì ìꞰ륌 ìíë ì¬ì©ìë ëŽê° ìì±í ë€ë¥ž êž°ë¥ì êŽì¬ìŽ ìì ì ììµëë€. https://docs.rs/num/0.2.1/num/fn.clamp.html
ìŽë¬í 볎ìŠì 묎ìì ëê¹?
ìë¹í ìì°ì€ë¬ìŽ êž°ëë iff x.clamp(a, b) == x
then a <= x && x <= b
ì
ëë€. x
ê° a
ëë b
ì ë¹êµí ì ìë PartialCmp
ììë 볎ì¥ëì§ ììµëë€.
ì€ëì ìŽë ŽíìŽ êž°ìµëë 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"ëŒë ìŽëŠìŽ ìŽ íšìì ì í©íë€ê³ ìê°í©ëë€.
clamp(a,b,c)
ë min(max(a,b), c)
ì ëìŒíê² ëìíŽìŒ íë€ê³ ìê°í©ëë€.
ë묞ì max
ë° min
구íëì§ ìì PartialOrd
ëíŽìŒ clamp
.
NaN
ë ìŽë¯ž ë
Œìëììµëë€ .
@EdorianDark ëìí©ëë€. min, maxìë PartialOrdë§ íìí©ëë€.
@noonien min
ë° max
ë Rust 1.0 ìŽíë¡ ì ìëììŒë©° Ord
ê° íìíê³ f32
ë° f64
ììµëë€.
ìŽê²ì ìŽë¬í êž°ë¥ì ë
Œìíêž°ì ì í©í ì¥ìê° ìëëë€.
ì¬êž°ì ì°ëŠ¬ë min
, max
ë° clamp
ë¹ì·íì§ë§ ëëì§ ìê² ëìíëë¡ ì£Œìí ì ììµëë€.
ížì§: PartialOrd
ìí©ìŽ ë§ìì ë€ì§ ìê³ float
ê° Ord
구ííëë¡ íê³ ì¶ì§ë§ 1.0 ìŽíìë ë ìŽì ë³ê²œí ì ììµëë€.
ìŽê²ì ìœ 1ë ë° ëì ë³í©ëìŽ ë¶ìì íŽì¡ìµëë€. ìì íì ëíŽ ìŽë»ê² ìê°íìëê¹?
ëë ìŽê²ì ìì ííë ê²ì ì¢ìí ê²ì ëë€!
clamp
ë©ìë ìŽëŠ 충ëìŽ ë¬žì ì²ëŒ ë€ëŠ¬ë©Ž https://github.com/rust-lang/rust/pull/66852#issuecomment -561667812ìì í ì§ì ìì ìŽëŠ íìžì ë³ê²œíë ê²ìŽ ì¢ìµëë€. ëììŽ ë ê²ì
ëë€. ìŽê²ë íšê».
@Xaeroxe ìì í PRì ì ì¶íê³ ìŽì ëí libs íì í©ì륌 ìì²íë 곌ì ìŽëŒê³ ìê° í©ëë€. t-libsê° ê³Œë¶íëìŽ FCê° ìë ê²ë€ì ë°ëŒì¡ì ì ìë ê² ê°ìµëë€.
ìê² ìµëë€. https://github.com/rust-lang/rust/pull/77872
@matkladë ì€ì ë¡ FCP ì ììŽ ìŽë¯ž ìë ì https://github.com/rust-lang/rust/issues/44095#issuecomment -544393395ìì ììëìì§ë§ ëšì íìžëìŽ íë ìêž° ë묞ì ì€ëšëììµëë€.
ê·žë° ê²œì° 1ë ì í ë² ì ë 묞ì ì ëíŽ íì ë°ë ê²ì ꜀ 견ëë§íë€ê³ ìê°í©ëë€.
@í€ë¬žë
@sfackler
@withoutboats
https://github.com/rust-lang/rust/issues/44095#issuecomment -544393395ê° ì¬ì í ì¬ë¬ë¶ì êŽì¬ì êž°ë€ëŠ¬ê³ ììµëë€.
libs íì FCPê° ììë ìŽíë¡ êœ€ ë§ìŽ ë°ëììµëë€. ìì í PRìì ìë¡ìŽ FCP륌 ììíë ê²ì ëíŽ ëªšë ìŽë»ê² ìê°íìëê¹? ì¬êž°ìì ëëšžì§ íìžëì êž°ë€ëŠ¬ë ê²ë³Žë€ ë ì€ë ê±žëŠ¬ì§ ìììŒ í ê² ê°ìµëë€.
@LukasKalbertodd êŽì°®ìµëë€. ììíìê² ìµëê¹?
FCPê° ìŽì ìì í PRìì ë°ìíêž° ë묞ì ì¬êž°ìì FCP륌 ì·šìí©ëë€. https://github.com/rust-lang/rust/pull/77872#issuecomment -722982535
@fcpbot ì·šì
ì
@rfcbot ì·šì
@m-ou-se ì ììŽ ì·šìëììµëë€.
ê°ì¥ ì ì©í ëêž
ì¬ëë€ìŽ íì¥ í¹ì±ì ì ìíêž°ì 충ë¶íꞰ륌 ìíë ë©ìëê° íì€ ëŒìŽëžë¬ëŠ¬ì ì¶ê°ë ì ìë€ë©Ž ì°ëŠ¬ë ë§€ì° ëì ìì¹ì ìë ê² ê°ìµëë€.