https://github.com/rust-lang/rfcs/pull/1961ã®è¿œè·¡ã®åé¡
PRã¯ãã¡ãïŒ ïŒ44097 ïŒ58710
å®å®åPRïŒ https ïŒ
TODOïŒ
泚æïŒããã¯ãµãŒããšãã¹ãã¡ã€ã³ããŒãå£ããŸããã
cc @ rust-lang / libsãããã¯min
/ max
ã«äŒŒãã±ãŒã¹ã§ããšã³ã·ã¹ãã ã¯ãã§ã«clamp
ååã䜿çšããŠãããããè¿œå ãããšãããŸãããçããŸãã ã ããã¯ãsemverããªã·ãŒããšã«èš±å¯ãããŠããç Žæã§ãããããã§ãããŠã³ã¹ããªãŒã ã®çã¿ãåŒãèµ·ãããŠããŸãã
ç«ææ¥ã®ããªã¢ãŒãžäŒè°ã«ããããŒãã
ãããŸã§ã®éãäœãèãã¯ãããŸããïŒ
ç¹°ãè¿ããªãã»ãããããšããç¹ã§ãç§ã¯ããã«ã€ããŠäœ¿ã£ãŠããŸãã ãã¯ã©ã³ããã¯ããããçŽ æŽãããååã§ãããå¥ã®ååãéžæããããšã§ãããåé¿ã§ããŸããïŒ
restrict
clamp_to_range
min_max
ïŒæå°å€ãšæ倧å€ãçµã¿åããããããªãã®ã ããïŒ
ãããã¯æ©èœããå¯èœæ§ããããŸãã ã¯ã¬ãŒã¿ãŒã䜿çšããŠã clamp
ã®åœ±é¿ãå®éã«ã©ãã»ã©æªãããå€æã§ããŸããïŒ clamp
ã¯ãããã€ãã®èšèªãšã©ã€ãã©ãªã§ããèªèãããŠããŸãã
ååãå€æŽããå¿ èŠããããšæãããå Žåã¯ãPRãããã«å ã«æ»ããŠãããã¯ã¬ãŒã¿ãŒãªã©ã§ããæ éã«ãã¹ãããããšããå§ãããŸãã
ãã¡ããã ç§ã¯ãããŸã§ç«å£ã䜿ã£ãããšããããŸããããåŠã¶ããšã¯ã§ããŸãã
@Xaeroxeããããã¿ãŸãããç§ã¯ããã«å ã«æ»ãPRãååŸããããšãæå³ããŸããã ïŒç§ã¯ä»æ¥äŒæäžãªã®ã§ãçéžãæäŒãããã«ã @ BurntSushiã@alexcrichtonãªã©ã®libsã®ä»ã®èª°ããå¿ èŠã«ãªãå ŽåããããŸãïŒã
çŸåšPRã®æºåãããŠããŸãã ããªãã®äŒæã楜ããã§ãã ããïŒ
clamp_to_range(min, max)
ã¯clamp_to_min(min)
ãšclamp_to_max(max)
ïŒ min <= max
ãšããè¿œå ã®ã¢ãµãŒã·ã§ã³ã䜿çšïŒããããã®é¢æ°ãåå¥ã«åŒã³åºãããšãã§ããŸããïŒ
ç§ã¯ãã®èããRFCã矩åä»ããŠãããšæããŸãã
ç§ã¯4è¡ã®é¢æ°ãstdã©ã€ãã©ãªã«åã蟌ãäœæ¥ã6ãæéè¡ã£ãŠããŸãããèšããããåŸãŸããã ã¡ãã£ãšç²ããŸããã åãé¢æ°ã2æ¥ã§numã«ããŒãžããã
@aturonã®ä»¥åã®ããããŒããåŒãç¶ã衚瀺ãããããã«ããããåéããŸãã
ããã¯æžé¢ã§è¡ãããå°æ¥ã®äººã ã®æéãç¡é§ã«ããªãããã«ãã©ã®ãããªå€æŽãå ããããšãã§ãããã«ã€ããŠã®ã¬ã€ãã³ã¹ãæŽæ°ããå¿ èŠããããšæããŸãã
ãããç Žæã®åå ãšãªãå¯èœæ§ãããããšã¯ãæ©ã段éããéåžžã«æçœã§ããã å人çã«ãç§ã¯ãããord_max_min
ãšæ¯èŒããŸããã
ãããŠãããã«å¯Ÿããå¿çã¯ããé¢æ°Ord::min
ãè¿œå ãããŸãã[...] libsããŒã ã¯ããããç ŽæãšããŠåãå
¥ãããããšæ¬æ¥æ±ºå®ããŸãããã§ããã ãããŠãããã¯ããäžè¬çãªååã®TMTOWTDIæ©èœã§ãããã clamp
ã¯å¥ã®åœ¢åŒã§stdã«ãŸã ååšããŠããŸãã
䞻芳çã«ã¯ããã®RFCãå
ã«æ»ãããå Žåãå®éã®ã«ãŒã«ã¯ãåºæ¬çã«ã Iterator
ãé€ããŠãstdã®ãã¬ã€ãã«æ°ããã¡ãœãããé
眮ããããšã¯ã§ããŸããããšæããŸãã
ãŸããå®éã®åã«æ°ããã¡ãœãããå®éã«é 眮ããããšãã§ããŸããã 誰ããstdã®ã¿ã€ãã®ãæ¡åŒµç¹æ§ããæã£ãŠããç¶æ³ãèããŠã¿ãŸãããã stdã¯ããã®ã¿ã€ãã®å®éã®ã¡ãœãããšããŠæäŸãããæ¡åŒµç¹æ§ã®ã¡ãœãããå®è£ ããããã«ãªããŸããã ãã®åŸãããã¯å®å®ããŸããããã®æ°ããã¡ãœããã¯ãŸã æ©èœãã©ã°ã®èåŸã«ãããŸãã ã³ã³ãã€ã©ã¯ãã¡ãœãããæ©èœãã©ã°ã®èåŸã«ãããå®å®ããããŒã«ãã§ãŒã³ã§ã¯äœ¿çšã§ããªããšæå¥ãèšããŸããã³ã³ãã€ã©ã以åã®ããã«æ¡åŒµãã¬ã€ãã®ã¡ãœãããéžæããŠãå®å®ããã³ã³ãã€ã©ã§ç ŽæãåŒãèµ·ãã代ããã«ã
ãŸãã泚ç®ã«å€ããŸããããã¯ãæšæºã©ã€ãã©ãªã®åé¡ã ãã§ã¯ãããŸããã ã¡ãœããåŒã³åºãã®æ§æã«ããããšã³ã·ã¹ãã ã®ã»ãŒã©ãã«ã§ãé倧ãªå€æŽãå°å ¥ãããã®ãåé¿ããããšãéåžžã«å°é£ã«ãªããŸãã
ïŒã¡ã¿ïŒããã«irloã§
ïŒ44438ãæ£åœåãããããšã«åæããå Žåã
ã®ãããªä¿èšŒåæšè«ã®ç Žæãæ¬åœã«XIBãšããŠç¡èŠã§ãããã©ãããåèããå¿ èŠããããããããŸããã
çŸåšãåæšè«ã®å€æŽã¯ãRFC 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ã¯ãããŸããŸãªã¿ã€ãã«ãã£ãŠéåžžã«äžè¬çã«å®è£ ãããŠãããã¬ã€ãã«ã¡ãœãããæ¬åœã«è¿œå ããå¿ èŠããããŸããïŒ æ¢åã®ãã¬ã€ãã«ãã€ã€ã³ãããã¹ãŠã®ã¿ã€ãã®APIã«è¿œå ãããšãã¯ã泚æããå¿ èŠããããŸãã
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãæ¥ããšãæ¡åŒµã¡ãœãããæ¡åŒµãã¬ã€ãã«é 眮ããŠãäœã倱ãããŸããã
åä»ãªéšåã®1ã€ã¯ãæ°ããstdã¡ãœãããã³ãŒããå£ããå Žåãäžå®å®ã§ãããããå®éã«äœ¿çšã§ããããã«ãªããã£ãšåã«è¡šç€ºãããããšã§ãã ãã以å€ã¯ãåãæå³ã®ã¡ãœãããšã®ç«¶åã§ããã°ããã»ã©æªãã¯ãããŸããã
ç Žæãé¿ããããã«ãã®é¢æ°ã«å¥ã®ååãä»ããã®ã¯æªã解決çã ãšæããŸãã ããã¯æ©èœããŸããããã®æ©èœã䜿çšããŠã³ãŒãã®å°æ¥ã®å¯èªæ§ãæé©åããã®ã§ã¯ãªããããã€ãã®ã¯ã¬ãŒãïŒãã¹ãŠãæ¯æ©ãªããã€ã³ããŠããïŒãå£ããªãããã«æé©åããŸãã
ç§ã«ã¯ããã€ãã®æžå¿µããããŸããããã®ãã¡ã®ããã€ãã¯å¿é ããå¿ èŠã¯ãããŸããã
ååç©ã¿ã€ã
BtreeSet<BtreeSet<impl Ord>>::range
ãšåããããçã«ããªã£ãŠãããšæããŸãã ãã ãã Vec<char>
ããã«ã圹ç«ã€å¯èœæ§ãããç¹å®ã®ã±ãŒã¹ããããŸãã
å€ã«ããåŒã³åºãã¢ãŒã
ãããRFCã§åãäžãããããšããçãã¯åã«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
ã¯ãç©äºãã²ã£ããè¿ããªã©ãä»ã®å¯èœæ§ãéããŸãïŒããã«ãããautorefã§ããã€ãã®èå³æ·±ãå¯èœæ§ãå¯èœã«ãªããååã®è¡çªãå®å
šã«åé¿ãããŸãïŒã
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
ã§ãïŒwinkïŒ
ããããäžè²«æ§ã¯çŽ æŽãããã§ãã
@egilburgRustã¯çŽæ¥ãªãŒããŒããŒãããµããŒãããŠããŸããã ãªãã·ã§ã³2ãææ¡ã§æ©èœãããã«ã¯ã RangeInclusive
ã RangeToInclusive
ãããã³RangeFrom
ã«å®è£
ãããæ°ããç¹æ§ãå¿
èŠã§ãããããã¯ãããªãéããšæããŸãã
ãã®ãªãã·ã§ã³3ãæè¯ã®ãªãã·ã§ã³ã ãšæããŸãã
1ãŸãã¯2ã¯æãé©ãã¹ãããšã§ã¯ãããŸããã ããŒã«ã«å®è£ ãæšæºå®è£ ã«çœ®ãæããããã«å€ãã®ã³ãŒããå®è¡ããå¿ èŠãå°ãªãããã1ã®ãŸãŸã«ããŠãããŸãã
_ãã¹ãŠ_ç¯å²*ã¿ã€ãã䜿çšãããããããã®_ãªã_ã䜿çšããããšãèšç»ããå¿ èŠããããšæããŸãã
ãã¡ãããããã¯å°é£ã®ãããªãã®ã®ããã Range
ã®ããã®ããRangeInclusive
ã ãããã (0.0..1.0).clamp(2.0_f32)
=> 0.99999994_f32
äœãããããšããããŸãã
@kennytmã§ã¯ããªãã·ã§ã³3ã§ãã«ãªã¯ãšã¹ããéããšãããŒãžããããšæããŸããïŒ
ãŸãã¯ã次ã«é²ãæ¹æ³ã«ã€ããŠã©ãæããŸããïŒ
@EdorianDarkããã«ã€ããŠã¯ã@ rust-lang / libsã«è³ªåããå¿ èŠããããŸãð
ç§ã¯å人çã«ãªãã·ã§ã³2ã奜ãã§ã RangeInclusive
ã ãã§ãã åè¿°ã®ããã«ããéšåã¯ã©ã³ããã¯min
ãšmax
ãã§ã«ååšããŸãã
@SimonSapinã«åæã@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.)
}
䜿çšããåœä»€ã1ã€å°ãªããªããŸãã
vxorps xmm1, xmm1, xmm1
vmaxss xmm0, xmm0, xmm1
vminss xmm0, xmm0, dword ptr [rip + .LCPI1_0]
ããã¯ã¯ã©ã³ãã®å®è£ ã«åºæã®ãã®ã§ããããããšãLLVMæé©åã®çã§ããïŒ
@kornelski clamp
ing NAN
ã¯ããã®NAN
ãä¿æããããšã«ãªã£ãŠããŸããã max
/ min
ã§ããããã maxmined
ã¯ä¿æããŸããã min
ã¯_non_- NAN
ãŸãã
NANã®æåŸ ã«å¿ããããçãå®è£ ãèŠã€ããã®ã¯çŽ æŽãããããšã§ãã ãããŠãdoctestsãNANã®åãæ±ãã玹ä»ããã®ã¯è¯ãããšã§ãã å ã®PRã«ã¯ããã€ããã£ãããã§ãïŒ
@scottmcmhttps ïŒ//github.com/rust-lang/rust/pull/59327å®äº
æå°ãŸãã¯æ倧ãNaNã®å Žåãã¯ã©ã³ããããŒãããããã¯ã«ãªãã®ã¯ãªãã§ããïŒ ã¢ãµãŒã·ã§ã³ãassert!(min <= max)
ããassert!(!(min > max))
ã«å€æŽããŠãmaxããã³minã¡ãœããã®å Žåãšåæ§ã«ãNaNã®æå°å€ãŸãã¯æ倧å€ã圱é¿ãäžããªãããã«ããŸãã
ã¯ã©ã³ãå
ã®min
ãŸãã¯max
NANã¯ãããã°ã©ãã³ã°ãšã©ãŒã瀺ããŠããå¯èœæ§ããããã¯ã©ã³ããããŠããªãããŒã¿ãIOã«ãã£ãŒãããããããæ©ããããã¯ã«é¥ãæ¹ããããšèããŸããã äžéãŸãã¯äžéãå¿
èŠãªãå Žåããã®é¢æ°ã¯é©ããŠããŸããã
äžéãŸãã¯äžéãå¿
èŠãªãå Žåã¯ããã€ã§ãINFãš-INFã䜿çšã§ããŸãããïŒ NaNãšã¯ç°ãªãããããæ°åŠçã«æå³ããããŸãã ãã ããã»ãšãã©ã®å Žåã max
ãšmin
ã䜿çšããããšããå§ãããŸãã
@Xaeroxeå®è£ ããŠããã ãããããšãããããŸãã
ãããããå®å®ããã³ãŒããå£ããªããå€åããã¯æ¬¡ã®çã«è¡ããããããŸãããïŒ
IMOããã詳现ã«æ€èšãã䟡å€ã®ããããšã®1ã€ã¯ã f32
/ f64
çåŽã¯ã©ã³ãã§ãã è°è«ã¯ãã®ãããã¯ã«ç°¡åã«è§Šããããã§ãããå®éã«ã¯è©³çŽ°ã«ã¯èæ
®ãããŠããŸããã
ã»ãšãã©ã®å ŽåãçåŽã¯ã©ã³ããžã®å
¥åãNANã®å Žåãçµæãã¯ã©ã³ãå¢çã«ãªãããããçµæãNANã§ããæ¹ã䟿å©ã§ãã ãããã£ãŠãæ¢åã®f32::min
f64::max
é¢æ°ãš
ç§ããããåãäžããçç±ã¯ãäž¡é¢ã¯ã©ã³ããšçé¢ã¯ã©ã³ããäžè²«ããã€ã³ã¿ãŒãã§ãŒã¹ãæã£ãŠãããšããã®ã§ãäž¡é¢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
åŒæ°ãåãããã«ãããã§ãããã Ord::clamp
ã«å¯ŸããŠ2ã€ã®åŒæ°ãåªå
ãããã1ã€ã®RangeInclusive
åŒæ°ãåªå
ãããã«ã€ããŠãã©ã¡ãã®æ¹æ³ã§ã匷ãæèŠã¯ãªãã£ãããã§ãã
ããããã§ã«è§£æ±ºãããåé¡ã§ããå Žåã¯ãç§ã®ã³ã¡ã³ããé æ ®ãªãåŽäžããŠãã ããã 以åã®è°è«ã§ããããèŠãªãã£ãã®ã§ãç§ã¯ãããã®ãã®ãæã¡åºãããã£ãã ãã§ãã
ããªã¢ãŒãžïŒä»¥äžã®APIã¯çŸåšäžå®å®ã§ããããããæããŸãã NaNã®åãæ±ã以å€ã«èæ
®ãã¹ãåé¡ã¯ãããŸããïŒ NaNåŠçã§ãããã¯ããã«ãæåã«Ord::clamp
å®å®ããã䟡å€ã¯ãããŸããïŒ
`` `é
ãããã¬ã€ãOrdïŒEq + PartialOrd
//âŠ
fnã¯ã©ã³ãïŒèªå·±ãæå°ïŒèªå·±ãæ倧ïŒèªå·±ïŒ->èªå·±ããã§èªå·±ïŒãµã€ãºèšå®{âŠ}
}
impl f32 {
pub fnã¯ã©ã³ãïŒèªå·±ãæå°ïŒf32ãæ倧ïŒf32ïŒ-> f32 {âŠ}
}
impl f64 {
pub fnã¯ã©ã³ãïŒèªå·±ãæå°ïŒf64ãæ倧ïŒf64ïŒ-> f64 {âŠ}
}
@SimonSapinå人çã«å šäœãå®å®ããããã§ã
+1ãããã¯å®å šãªRFCãééãããã以éã«åºãŠããè³æã¯ãªããšæããŸãã ããšãã°ãNaNåŠçã¯ãIRLOããã³RFCã®è°è«ã§è©³çŽ°ã«åãäžããããŸããã
äºè§£ããŸãããããã§ååã§ãã
@rfcbotfcpããŒãž
ããŒã ã¡ã³ããŒã®@SimonSapinã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã¡ã³ããŒã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ã¬ãã¥ãŒã¢ã®éåæ°ãæ¿èªãããšïŒãããŠæ倧2ã€ã®æ¿èªãæªè§£æ±ºã«ãªããšïŒããããæçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
x.clamp(7..=13)
ãš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ïŒpullrequestreview- 207529970ã
.min
ãš.max
ã¯ã .min(...)
ã䜿çšããŠäžéãæå®ãã .max(...)
ã䜿çšããŠäžéãæå®ãããšããã°ãé »ç¹ã«çºçãããããããã¯éåžžã«æ®å¿µãªè§£æ±ºçã ãšæããŸããäžéã ããã¯éåžžã«çŽãããããããã«ã¯éåžžã«å€ãã®ãã°ããããŸãã .clamp(..1.0)
ãš.clamp(0.0..)
ã¯éåžžã«æ確ã§ãã
@CryZeã¯éåžžã«è¯ãç¹ããmin =äžéãmax =äžéãééããããšããªãå Žåã§ããã©ã¡ãã䜿çšããããèŠããŠããããã«ç²Ÿç¥äœæãè¡ãå¿ èŠããããŸãã ãã®èªç¥çè² è·ã¯ãããªãã解決ããããšããŠããã©ããªåé¡ã«ãè²»ãããã»ããããã§ãããã
x.clamp(y, z)
ããã£ãšæåŸ
ãããŠããããšã¯ç¥ã£ãŠããŸãããããããããã¯é©æ°ã®æ©äŒã§ã;ïŒ
ç§ã¯åæã®æ®µéã§ç¯å²ãããªãå®éšããRFCãæ°ãæé ãããŠãå æ¬çç¯å²ãå®éšã§ããããã«ããŸããã ïŒããã¯å®å®ããåã«éå§ãããŸããïŒ
æµ®åå°æ°ç¹æ°ã®æä»ç¯å²ã«ã¯ã©ã³ããå®è£ ã§ããªãããšãçºèŠããŸããã äžéšã®ç¯å²ã¿ã€ãã®ã¿ããµããŒãããä»ã®ã¿ã€ãã¯ãµããŒãããªããšããçµæã¯é©ãã¹ããã®ã§ããããã®ãããRFCãæ°ãæé ãããŠãã®æ¹æ³ã§å®éšããã«ãããããããæçµçã«ç¯å²ã¯è§£æ±ºçã§ã¯ãªããšå€æããŸããã
@ m-ou-seïŒ44095ïŒã³ã¡ã³ãïŒããã³ïŒ58710ïŒã¬ãã¥ãŒïŒããå§ãŸããã£ã¹ã«ãã·ã§ã³ãåç §ããŠãã ããã
ç·šéïŒä»¥äžã§ææããããã«ããã«ãªã¯ãšã¹ãïŒïŒ58710ïŒã®ãã£ã¹ã«ãã·ã§ã³ã«ã¯ã远跡ã®åé¡ãããèšèšäžã®æ±ºå®ã«é¢ãããã£ã¹ã«ãã·ã§ã³ãå€ãå«ãŸããŠããŸãã ãããããã§äŒããããªãã£ãã®ã¯æ®å¿µã§ããããã§ã¯éåžžãèšèšã®è°è«ãè¡ãããŸãããè°è«ãããŸããã
äžéšã®ç¯å²ã¿ã€ãã®ã¿ããµããŒãããä»ã®ç¯å²ã¿ã€ãã¯ãµããŒãããªãããšã¯ãçµæã«é©ããããŸãã
Rustã¯ãã§ã«ããã€ãã®ç¯å²ãä»ã®ç¯å²ãšã¯ç°ãªãæ¹æ³ã§åŠçããŠããããïŒããšãã°ãå埩ã«äœ¿çšãããªã©ïŒãäžéšã®ç¯å²ã®ã¿ãclamp
åŒæ°ãšããŠèš±å¯ããããšã¯ãç§ã«ã¯ãŸã£ããé©ãããšã§ã¯ãããŸããã
ãããæã圹ç«ã€åæã§ãïŒ https ïŒ
@Xaeroxeäžéšã®ç¯å²ã¿ã€ãã®ã¿ããµããŒãããä»ã®ç¯å²ã¿ã€ãã¯ãµããŒãããŠããŸããã§ããã
圌ããå®å®ããåã«ããã«ã€ããŠèããŠããå Žåãæéãšäžè¬çãªäœ¿çšæ³ã¯ããªãã®æèŠãå€ããŸãããããããšããŸã ããã ãšæããŸããïŒ
æä»çç¯å²ã¯æŽæ°ãšã¯ç°ãªãåäœãããããããããŒãã«ã¯çµ¶å¯Ÿã«å®è£
ããªãã§ãã ããïŒç¯å²0..10
ã¯äžéãå«ã¿ãäžéãé€å€ããŸãããããã£ãŠãä»®æ³ç¯å²0.0...10.0
å¿
èŠãªã®ã¯ãªãã§ããã
@varkorããããããã¯ã远跡ã®åé¡ã«ã€ããŠã®è°è«ãªãã«ãã¬ãã¥ãŒã§ã®1ã€ã®ã³ã¡ã³ãã®åŸã«å€æŽãããŸããã
ããã¯é床ã«å¯Ÿç«çãªãã®ãšããŠåºããããããããŸããããäŒè©±ã調ã¹ããšãã«ãç¯å²ã䜿çšãã¹ãã§ãªãçç±ã«ã€ããŠèª¬åŸåã®ããè°è«ãèŠã€ãããŸããã§ããã誰ããç§ã«ãããææã§ããŸããïŒãã®ãããªãã®ãè©ŠããŠãã ããã
ããªããæ¢ããŠããè°è«ã¯ããã«ãããšæããŸãïŒ https ïŒ
ç·šé@Xaeroxeã¯ããã«ç§ãæã¡è² ãããŸãã:)
æéãšäžè¬çãªäœ¿çšæ³ãããªãã®æèŠãå€ããŸãã
ãããŸã§ã®ãšããããã§ã¯ãããŸããããç¯å²ã¯ç§ãæ¥åžžã®ã³ãŒãã£ã³ã°ã§äœ¿çšããããšã¯ã»ãšãã©ãããŸããã ç§ã¯ãã³ãŒãäŸãšéšåçãªç¯å²ããµããŒãããæ¢åã®APIã«èª¬åŸãããããšãåãå
¥ããŠããŸãã ãã ãããã®è³ªåã解決ãããšããŠããscottmcmãRFCã³ã¡ã³ãã§æèµ·ããä»ã®ããã€ãã®åªããç¹ã«å¯ŸåŠããå¿
èŠããããŸãã ããšãã°ã Step
ã¯Ord
ã»ã©å€ãã®ã¿ã€ãã«å®è£
ãããŠããŸãããããã®ãã€ããŒãªæ§æäžã®å€æŽã¯ãããã®ã¿ã€ãã倱ã䟡å€ããããŸããïŒ ããã«ãéå
æ¬çç¯å²ã¯ã©ã³ãã®äœ¿çšäŸã¯ãããŸããïŒ ç§ã®ç¥ãéããæä»çãªç¯å²ã¯ã©ã³ãããµããŒãããå¿
èŠæ§ãæããèšèªããã¬ãŒã ã¯ãŒã¯ã¯ä»ã«ãããŸããã§ãããããã§ãã©ã®ãããªã¡ãªãããåŸãããã§ããããã ç¯å²ãæºè¶³ã®ããæ¹æ³ã§å®è£
ããããšã¯ã¯ããã«å°é£ã§ãããå€ãã®æ¬ ç¹ãšããããªå©ç¹ããããŸããã
ç¯å²ã䜿çšããŠãããå®è£ ãããšã次ã®
ãããã£ãŠããã®ã¢ãããŒããæ¡çšãã¹ãã§ã¯ãªããšæãçç±ãããã€ããããŸãã
å¿
èŠãªç¯å²ã®éžæã¯ãæ°ããç¹æ§ãå¿
èŠãšããã»ã©æ¬æ°ã§ãããç¹ã«æãäžè¬çãªç¯å²ã§ããRange
é€å€ããŸãã
ç§ãã¡ã¯ãã§ã«RFCããã»ã¹ã§ãããŸã§ã®ãšããé²ãã§ãããããããstdãåŸãå¯äžã®ããšã¯ã .max()
ãŸãã¯.min()
ãèšè¿°ããããã«å¥ã®æ¹æ³ã§ãã Rustã§ãã§ã«å®è¡ã§ããããšãå®è£
ããããã«ãRFCãããã»ã¹ã®æåã«æ»ãããã¯ãããŸããã
ãŸã ååšãããã©ããããããªããŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããããã«ãé¢æ°ã§çºçããåå²ã®éã2åã«ãªããŸãã ããããã³ãããŒã¯ã«è¡šç€ºãããããšã¯ã§ããŸããã
... stdãããããåŸãããå¯äžã®ããšã¯ã
.max()
ãŸãã¯.min()
ãèšè¿°ããããã«å¥ã®æ¹æ³ã§ãã
ç§ãèšãããã£ãäž»ãªãã€ã³ãã¯ã .min()
/ .max()
ãšçåŽã¯ã©ã³ãã®éã®ãã®æãããªåçæ§ãè°è«ã®äžã§äœåºŠãåºãŠããã®ãèŠããšããããšã§ãããæäœã¯åçã§ã¯ããNAN
ãåŠçããæ¹æ³ã§ã®æµ®åå°æ°ç¹æ°ã®å Žåã
ããšãã°ã input.max(0.)
ããè² ã®æ°ããŒãã«ã¯ã©ã³ãããåŒãšèŠãªããŸãã input
ãNAN
以å€ã®å Žåãæ£åžžã«æ©èœããŸãã ãã ãã input
ãNAN
å Žåã 0.
ãšè©äŸ¡ãããŸãã ãããæãŸããåäœã«ãªãããšã¯ã»ãšãã©ãããŸããã çåŽã¯ã©ã³ãã¯NAN
å€ãä¿æããå¿
èŠããããŸãã ïŒãã®ã³ã¡ã³ããšãã®ã³ã¡ã³ããåç
§ããŠãã ãããïŒçµè«ãšããŠã .max()
ã¯ã2ã€ã®æ°å€ã®ãã¡å€§ããæ¹ããšãã«ã¯ããŸãæ©èœããŸãããçåŽã¯ã©ã³ãã«ã¯ããŸãæ©èœããŸããã
ãããã£ãŠãæµ®åå°æ°ç¹æ°ã«ã¯çåŽã¯ã©ã³ãæäœïŒ .min()
/ .max()
ïŒãå¿
èŠã§ãã ä»ã®äººã¯ãéæµ®åå°æ°ç¹åã®çåŽã¯ã©ã³ãæäœã®æçšæ§ã«ã€ããŠãè¯ãè°è«ãããŸããã 次ã®è³ªåã¯ããããã®æäœãã©ã®ããã«è¡šçŸããããã§ãã
.clamp()
ãšINFINITY
ã€ãŸããçåŽã¯ã©ã³ãæäœãè¿œå ããªãã§ãã ããã INFINITY
ãŸãã¯NEG_INFINITY
å¢çã§.clamp()
ã䜿çšããããã«ãŠãŒã¶ãŒã«æ瀺ããã ãã§ãã ããšãã°ããŠãŒã¶ãŒã«input.clamp(0., std::f64::INFINITY)
ãšæžãããã«äŒããŸãã
ããã¯éåžžã«åé·ã§ããã NAN
åŠçã®åŸ®åŠãªéãã«æ°ä»ããŠããªãå ŽåããŠãŒã¶ãŒã¯èª€ã£ã.min()
/ .max()
ããããã«ãªããŸãã ããã«ã T: Ord
å Žåã¯åœ¹ã«ç«ã¡ãŸããããŸããIMOã¯ä»ã®æ¹æ³ãããæ確ã§ã¯ãããŸããã
.clamp_min()
ããã³.clamp_max()
劥åœãªãªãã·ã§ã³ã®1ã€ã¯ã .clamp_min()
.clamp_max()
ã¡ãœãããšclamp
å®è£
ãå®å®ãããã«ã¯ããã®ã¢ãããŒãã䜿çšããå¿
èŠãããããšãèªèããŠããããšã確èªãããã£ãã ãã§ãã
å¥ã®ãªãã·ã§ã³ã¯ã clamp
ã«ç¯å²åŒæ°ãåãããã«ããããšã§ãã @Xaeroxeã¯ãããå®è£
ãã1ã€ã®æ¹æ³ã瀺ããŸãããã圌ãè¿°ã¹ãããã«ããã®å®è£
ã«ã¯ããã€ãã®æ¬ ç¹ããããŸãã å®è£
ãäœæããå¥ã®æ¹æ³ã¯ãã¹ã©ã€ã¹ãçŸåšå®è£
ãããŠããæ¹æ³ïŒ 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
æä»ç¯å²ã®å®è£
ãè¿œå ã§ããŸããSliceIndex
ãã¬ã€ããšåæ§ã«ã Clamp
ãã¬ã€ããå€éã®ã¿ä¿æã§ããŸãã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
ç£èŽ
ã§ãããç¯å²ã¿ã€ããç°ãªãæ¹æ³ã§åŠçãããå°ãªããšã1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã§ããïŒããã«ã誰ããæä»çç¯å²ã䜿çšããããšããå Žåããšã©ãŒã¡ãã»ãŒãžã¯ç解ããããã§ãããïŒ ãç¹æ§å¢ç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_min()
/ .clamp_max()
代ããã«.clamp_lower()
/ .clamp_upper()
ãŸãã¯.clamp_to_start()
/ .clamp_to_end()
ããã«åé·ïŒ input.clamp_lower(0)
察input.clamp(0..)
ïŒãç¯å²åŒæ°ã¢ãããŒãã«ã¯ã次ã®æ¬ ç¹ããããŸãã
.clamp_min()
/ .clamp_max()
è¿œå ãããããè€éã§ããClamp
ãå®è£
ããªãããŸãã¯å®è£
ã§ããªããšå€æããå Žåãããã¯é©ãã¹ãããšãããããŸããããæ¢åã®.clamp
ã+ .clamp_min()
+ .clamp_max()
ã¢ãããŒããšç¯å²åŒæ°ã¢ãããŒãã«ã€ããŠã¯åŒ·ãæèŠã¯ãããŸããã ããã¯ãã¬ãŒããªãã§ãã
@Xaeroxe
ãŸã ååšãããã©ããããããªããŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããããã«ãé¢æ°ã§çºçããåå²ã®éã2åã«ããŸããããããã³ãããŒã¯ã«è¡šç€ºãããããšã¯ã§ããŸããã
ãã¶ããäœåãªãã©ã³ãã¯LLVMã«ãã£ãŠæé©åãããŸããïŒ
çåŽã¯ã©ã³ãã«ã€ããŠ
ã¯ã©ã³ãã¯äž¡åŽã§å
æ¬çã§ãããããçåŽã®ã¿ã®ã¯ã©ã³ãåäœãååŸããã«ã¯ãå·Š/å³ã§æå°/æ倧ãæå®ããã ãã§ãã ããã¯å®å
šã«åãå
¥ãããããšã«ããé©åããRange*
ã¿ã€ãããªã.clamp((Bound::Unbounded, Inclusive(3.2)))
ãããééããªãè¯ããšæããŸãã
x.clamp(i32::MIN, 10);
x.clamp(-f32::INFINITY, 10.0);
LLVMã¯ããããµã€ããç°¡åã«æé©åã§ãããããããã©ãŒãã³ã¹ã®äœäžã¯ãããŸããïŒ https ïŒ
ç¯å²æ§æã¯ãã£ãããã§ããã clamp
ã¯ååã«åºæ¬çã§ããããã2ã€ã®å¥ã
ã®åŒæ°ã§åé¡ãªãç解ã§ããŸãã
ãã¶ãmin
/ max
NaN
åŠçã¯ãããšãã°f32
ã®åºæã®ã¡ãœããã®å®è£
ãå€æŽããããšã«ãã£ãŠãããèªäœã§ä¿®æ£ã§ããŸããïŒ ãŸãã¯PartialOrd::min/max
å°éã«ããŸããïŒ ïŒRustãlibstdã§ç©äºãåãæ¿ããæ¹æ³ãèŠã€ããããšãã§ãããšä»®å®ãããšããšãã£ã·ã§ã³ãã©ã°ä»ãïŒã
@scottmcmRangeToInclusiveããã§ãã¯ããå¿ èŠããããŸãã
ãããããå°ãèããåŸãå®å®ã¯æ°žé ã§ããããšã«æ°ã¥ããŸããããããã£ãŠããRFCããã»ã¹ã®ãªã»ããããå€æŽããªãçç±ãšèŠãªãã¹ãã§ã¯ãããŸããã
ãã®ããã«ããããå®è£ ãããšãã®èãæ¹ã«æ»ããããšæããŸãã ã¯ã©ã³ãã¯æŠå¿µçã«ç¯å²å šäœã§åäœãããããç¯å²ãè¡šçŸããããã«Rustããã§ã«çšæããŠããèªåœã䜿çšããããšã¯çã«ããªã£ãŠããŸãã ããã¯ç§ã®ã²ãã®ããããåå¿ã§ããããããŠããã¯ä»ã®å€ãã®äººã ã«ãšã£ãŠã®åå¿ã®ããã§ãã ããã§ã¯ããã®ããã«ããªãããšã«ã€ããŠã®è°è«ãç¹°ãè¿ãããããã«åè«ã§ãããã©ãããèŠãŠã¿ãŸãããã
å¿
èŠãªç¯å²ã®éžæã¯ãæ°ããç¹æ§ãå¿
èŠãšããã»ã©æ¬æ°ã§ãããç¹ã«æãäžè¬çãªç¯å²ã§ããRange
é€å€ããŸãã
Ord + Step
ãªã©ã®ç¹å®ã®Range*
ã¿ã€ãã«ããã«å¶éãè¿œå ã§ããããã«ãªããŸããã ãããã£ãŠãæä»çãªç¯å²ã¯ã©ã³ãã¯å®éã«ã¯å¿
èŠãªãããšããããããŸããããããã®æè¡çå¶éããªãç¯å²ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæãªãããšãªããããã§ç¯å²ã®å
šç¯å²ãå®éã«åãå
¥ããããšãã§ããŸããçåŽã¯ã©ã³ãã«ã¯ãInfinity / Min / Maxã䜿çšã§ããŸãã
Range*
æ§æã§ã¯ããã®ãŠãŒã¹ã±ãŒã¹ã®æåæ°ãšã€ã³ããŒãæ°ãå°ãªããªããŸãããããè¡ããªãçç±ã«åè«ããã®ã§ããªãã·ã§ã³ã¯åçã«èŠããããããã®ã³ã¡ã³ãã«ã¯å€æŽãå ããåæ©ããããŸããã å€æŽãå ããåæ©ãèŠã€ããŸãããã ç§ã«ã¯1ã€ã®çç±ãããããŸãããããã¯ããã®ã¹ã¬ããã®äžè¬çãªæèŠã¯ãç¯å²ããŒã¹ã®ã¢ãããŒããèšèªã®ã»ãã³ãã£ã¯ã¹ãæ¹åãããšããããšã§ããããã«æããããšããããšã§ãã å
æ¬çããã«ãšã³ãã¬ã³ãžã¯ã©ã³ãã ãã§ãªãã .min()
ã.max()
ãªã©ã®æ©èœã«ã䜿çšã§ããŸãã
ãã®èãæ¹ããRFCããã®ãŸãŸå®å®ãããããšã«è³æããŠããä»ã®äººã ãšäœããã®çœåŒåãæã£ãŠãããã©ããç§ã¯èå³ããããŸãã
Clampã¯ä»ã®èšèªãšéåžžã«äŒŒãŠãããããçŸåšã®åœ¢åŒã®ãŸãŸã«ããŠããæ¹ããããšæããŸãã
ãã«ãªã¯ãšã¹ãïŒ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
äžè¬ã«ãrustã¯æ°å€ã«å¯ŸããŠ(number).method()
ã¢ãããŒããåããŸãïŒä»ã®èšèªã¯Math.Method(number)
䜿çšããŸãïŒããããã念é ã«çœ®ãããšããŠãããããnumber
å€æŽããå¯èœæ§ãããããšã¯è«ççãªä»®å®ã§ãã
[must_use]
å±æ§ãæè¿è¿œå ãã
@ Xaeroxeç¯å²ããŒã¹ã®ã¯ã©ã³ãçšã®äœããæãã€ããã®ã§ããïŒ
ä»ã®æ©èœã¯ä»ã®ãã³ã®æ°å€é¢æ°ã«äžçªåããšæããŸãã®ã§ããŸãå®å®ãããããšæããŸãã
çŸæç¹ã§ã¯ãã¬ã³ãžããŒã¹ã®ã¯ã©ã³ãã䜿çšããçç±ã¯ãããŸããã ã¯ãã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åºæã®ã¡ãœããã䜿çšããŠããã«ã¹ã¿ã PartialOrd
ã¿ã€ãã§ã¯ã©ã³ãã䜿çšã§ããããã«ã¯ãªããŸããã
çŸåšã®å®è£
ã§ã¯ã䜿çšããŠããªããŠãEq
ãå¿
èŠã§ãã
PartialOrd
ã®äž»ãªæžå¿µã¯ãä¿èšŒã匱ããªããã¯ã©ã³ãã®ä¿èšŒã匱ããªãããšã§ããã ãããPartialOrd
ãããŠãŒã¶ãŒã¯ãç§ãæžããå¥ã®é¢æ°ã«èå³ããããããããŸããhttps://docs.rs/num/0.2.1/num/fn.clamp.html
ãããã®ä¿èšŒã¯äœã§ããïŒ
ããªãèªç¶ãªæåŸ
ãããããšIFF 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åæããŸãã 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ãéè² è·ã«ãªã£ãŠããŠãfcped以å€ã®ãã®ã«è¿œãã€ããŠããªãããã§ãã
ããŠãããã¯https://github.com/rust-lang/rust/pull/77872ã§ããã
@matkladã¯ãå®éã«ã¯FCPã®ææ¡ãæšå¹Žhttps://github.com/rust-lang/rust/issues/44095#issuecomment -544393395ã§ãã§ã«éå§ãããŠã
ãã®å Žåãåé¡ã«ã€ããŠå¹Žã«1åçšåºŠpingãå®è¡ããããšã¯ããªã蚱容ã§ãããšæããŸãã
@ãã ã³ãã£
@sfackler
@withoutboats
https://github.com/rust-lang/rust/issues/44095#issuecomment-544393395ã¯ãŸã ããªãã®æ³šæãåŸ ã£ãŠããŸã
FCPãéå§ãããŠãããlibsããŒã ã¯ããªãå€åããŸããã å®å®åPRã§æ°ããFCPãéå§ããããšã«ã€ããŠãçããã¯ã©ãæããŸããïŒ ããã§æ®ãã®ãã§ãã¯ããã¯ã¹ãåŸ ã€ãããé·ãã¯ããããªãããã«æããŸãã
@LukasKalbertodtå æ°ã§ããããã¯ãªãããŠãããããã§ããïŒ
FCPãå®å®åPRã§çºçãããããããã§FCPããã£ã³ã»ã«ããŸãïŒ //github.com/rust-lang/rust/pull/77872#issuecomment -722982535
@fcpbotãã£ã³ã»ã«
ãããš
@rfcbotãã£ã³ã»ã«
@ m-ou-seã®ææ¡ã¯ãã£ã³ã»ã«ãããŸããã
æãåèã«ãªãã³ã¡ã³ã
æ¡åŒµç¹æ§ãå®çŸ©ããã®ã«ååãªæ¹æ³ã人ã ãæãã§ããã¡ãœãããæšæºã©ã€ãã©ãªã«è¿œå ã§ããªãå Žåãç§ãã¡ã¯ããªãæªãå Žæã«ããããã§ãã