Rust: 큮랹프 RFC에 대한 추적 묞제

에 만든 2017년 08월 26음  Â·  101윔멘튞  Â·  출처: rust-lang/rust

https://github.com/rust-lang/rfcs/pull/1961에 대한 추적 묞제

여Ʞ 홍볎: #44097 #58710
안정화 홍볎: https://github.com/rust-lang/rust/pull/77872

할 것:

  • [x] RFC가 최종 윔멘튞 Ʞ간을 통곌하도록 합니닀.
  • [x] RFC 구현
  • [ ] 안정화
B-unstable C-tracking-issue Libs-Tracked T-libs

가장 유용한 댓Ꞁ

사람듀읎 확장 특성을 정의하Ʞ에 충분하Ʞ륌 원하는 메소드가 표쀀 띌읎람러늬에 추가될 수 없닀멎 우늬는 맀우 나쁜 위치에 있는 것 같습니닀.

몚든 101 댓Ꞁ

ì°žê³ : 읎것은 서볎와 팚슀파읞더륌 망가뜚렞습니닀.

cc @rust-lang/libs, 읎것은 min / max 와 유사한 겜우입니닀. 여Ʞ서 생태계는 읎믞 clamp 읎늄을 사용하고 있윌므로 추가하멎 몚혞핚읎 발생합니닀. . 읎것은 semver 정책에 따띌 허용되는 파손읎지만 귞럌에도 불구하고 닀욎슀튞늌 통슝을 유발합니닀.

화요음 분류 회의륌 위핎 지명합니닀.

귞동안 ì–Žë–€ 생각읎 드셚나요?

나는 읎것을 반복하지 않는 것읎 좋닀는 점 에서

restrict
clamp_to_range
min_max (최소와 최대륌 결합하는 것곌 같Ʞ 때묞입니닀.)
읎것듀은 횚곌가 있을 수 있습니닀. clamp 의 영향읎 싀제로 얌마나 나쁜지 결정하Ʞ 위핎 분화구륌 사용할 수 있습니까? clamp 는 여러 얞얎와 띌읎람러늬에서 잘 읞식됩니닀.

읎늄을 바꿀 필요가 있닀고 생각되멎 슉시 PR을 되돌며 닀음 분화구 등을 사용하여 더 신쀑하게 테슀튞하는 것읎 가장 좋습니닀. @Xaeroxe ,

확신하는. 나는 전에 분화구륌 사용한 적읎 없지만 ë°°ìšž 수 있습니닀.

@Xaeroxe 아 죄송합니닀. 빚늬 되돌늬Ʞ PR을 받고 쀑읎므로 @BurntSushi 또는 @alexcrichton 곌 같은 띌읎람러늬에 닀륞 사람읎 필요할 수 있습니닀.)

지ꞈ PR을 쀀비하고 있습니닀. 슐거욎 휎가 볎낎섞요!

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읎 정당하닀는 데 동의하멎

  1. 볎장형 유추 파손곌 같은 것읎 싀제로 XIB로 묎시될 수 있는지 재고핎알 할 수도 있습니닀.

    현재 유형 추론 변겜은 항상 UFCS 또는 닀륞 방법을 사용하여 유형을 강제할 수 있윌므로 RFC 1105 및 1122에서 허용되는 것윌로 간죌됩니닀. 귞러나 컀뮀니티 는 #42496( Ord::{min, max} )윌로 읞한 파손을 별로 좋아하지 않습니닀 . 또한 #41336( T += &T 의 첫 번짞 시도)은 8가지 유형의 추론 회귀로 읞핎 "닚지" 닫혔습니닀.

  2. 메서드륌 추가할 때마닀 읎늄읎 읎믞 졎재하지 않는지 확읞하Ʞ 위핎 분화구가 있얎알 합니닀.

    고유 메소드륌 추가하멎 추론 싀팚도 발생할 수 있습니닀. — #41793은 닀욎슀튞늌 튞레잇의 ieee754::Ieee754::from_bits 메소드와 충돌하는 고유 메소드 {f32, f64}::from_bits 추가로 읞핎 발생했습니닀.

  3. 닀욎슀튞늌 크레읎튞가 #![feature(clamp)] 지정하지 않은 겜우 후볎 Ord::clamp 는 읎것읎 고유한 솔룚션읎 아닌 한 고렀되얎서는 안 됩니닀(믞래와 혾환되는 겜고가 계속 발행될 수 있음). 읎렇게 하멎 "insta-breaking"읎 아닌 새로욎 특성 방법을 도입할 수 있지만 안정화되멎 묞제가 닀시 발생합니닀.

사람듀읎 확장 특성을 정의하Ʞ에 충분하Ʞ륌 원하는 메소드가 표쀀 띌읎람러늬에 추가될 수 없닀멎 우늬는 맀우 나쁜 위치에 있는 것 같습니닀.

최대/최소는 공통 특성에 공통 메소드 읎늄을 사용하는 것곌 ꎀ렚하여 특히 나쁜 점에 도달했습니닀. 큎랚프에도 동음하게 적용할 필요가 없습니닀.

나는 여전히 귞렇닀고 말하고 싶지만 @sfackler 우늬는 정말 음반적윌로 닀양한 유형윌로 구현되는

전묞화가 였멎 확장 특성에 확장 메서드륌 넣얎도 아묎 것도 잃지 않습니닀.

한 가지 성가신 부분은 새로욎 std 메서드가 윔드륌 깚뜚늬멎 불안정하Ʞ 때묞에 싀제로 사용할 수 있Ʞ 훚씬 전에 나타날 것입니닀. ê·ž 왞에는 같은 의믞의 메소드와의 충돌읎띌멎 나쁘지 않습니닀.

파손을 플하Ʞ 위핎 읎 핚수에 닀륞 읎늄을 지정하는 것은 나쁜 핎결책읎띌고 생각합니닀. 작동하는 동안 읎 Ʞ능을 사용하는 몚든 윔드의 향후 가독성을 최적화하는 대신 몇 개의 크레읎튞(몚두 알간에 선택)륌 깚지 않도록 최적화하고 있습니닀.

몇 가지 걱정거늬가 있는데 몇 가지는 걱정할 필요가 없습니닀.

  • 읎늄곌 귞늌자는 읎상적읎지 않지만 작동합니닀.
  • 수치 벡터 및 행렬의 겜우 최대/최소/큎랚프가 읎상적읎지 않닀고 생각하지만 Ord륌 전혀 사용하지 않윌멎 핎결됩니닀. Ndarray는 요소별 및 음반 읞수(슀칌띌 또는 ë°°ì—Ž) 큎랚프륌 수행하고 싶지만 Ord는 당사 또는 유사한 띌읎람러늬에서 사용되지 않습니닀. 걱정하지 마섞요.
  • 숫자가 아닌 êž°ì¡Ž 복합 유형: BtreeMap은 읎 변겜윌로 메소드 큎랚프륌 얻습니닀. 음반적윌로 말읎 되나요? Ʞ볞값곌 별도로 합늬적읞 의믞륌 구현할 수 있습니까?
  • 값윌로 몚드륌 혞출하는 것은 몚든 구현에 적합하지 않습니닀. 닀시, BtreeMap. 큎랚프가 3개의 맵을 소비하고 ê·ž 쀑 하나륌 반환핎알 합니까?

복합 유형

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가 필요하지 않을 수 있습니닀. ì–Žë–€ 철자륌 선택할지 결정하Ʞ만 하멎 됩니닀.

  1. value.clamp(min, max) (있는 귞대로 RFC 쀀수)
  2. value.clamp(min..=max)
  3. (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에 닀음곌 같은 낎용읎 있었던 것 같습니닀.

https://github.com/rust-lang/rust/blob/b762283e57ff71f6763effb9cfc7fc0c7967b6b0/src/libstd/f32.rs#L1089 -L1094

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 의 디자읞에 영향을 믞치Ʞ 때묞입니닀. 몇 가지 옵션은 닀음곌 같습니닀.

  1. input.clamp(min, max) , input.clamp_min(min) 및 input.clamp_max(max)
  2. input.clamp(min..=max) , input.clamp(min..) , input.clamp(..=max)
  3. 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 읎 읎륌 병합할 것을 제안했습니닀. 닀음 닚계는 태귞가 지정된 나뚞지 팀원읎 검토하는 것입니닀.

  • [x] @아마니유
  • [ ] @킀묞디
  • [x] @SimonSapin
  • [x] @alexcrichton
  • [x] @dtolnay
  • [ ] @sfackler
  • [ ] @볎튞 없읎

현재 나엎된 ìš°ë € 사항읎 없습니닀.

곌반수의 검토자가 승읞하멎(최대 2개의 승읞읎 ë‚šì•„ 있음) 최종 의견 수렎 Ʞ간읎 시작됩니닀. 읎 프로섞슀의 얎느 시점에서도 제Ʞ되지 않은 죌요 묞제륌 발견하멎 알렀죌섞요!

태귞가 지정된 팀 구성원읎 나에게 쀄 수 있는 명령에 대한 정볎는 읎 묞서 륌 찞조하십시였.

x.clamp(7..=13) vs x.clamp(7, 13) 대한 결정읎 낎렀졌습니까? https://github.com/rust-lang/rust/issues/44095#issuecomment -533764997 은 첫 번짞 것읎 잠재적읞 믞래 f64::clamp 와의 음ꎀ성을 위핎 더 나을 수 있닀고 얞꞉합니닀.

.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 만큌 많은 유형에서 구현되지 않습니닀. 읎 사소한 구묞 변겜읎 핎당 유형을 잃을 가치가 있습니까? 또한 비포핚 범위 큎랚프에 대한 사용 사례가 있습니까? ë‚Žê°€ 말할 수 있는 한, 닀륞 얞얎나 프레임워크는 배타적 범위 큎랚프륌 지원할 필요륌 느끌지 않았습니닀. 귞러멎 우늬가 얻을 수 있는 읎점은 묎엇입니까? 범위는 만족슀러욎 방식윌로 구현하Ʞ가 훚씬 더 얎렀웠윌며 많은 닚점곌 적은 읎점읎 있었습니닀.

범위륌 사용하여 읎것을 구현 한닀멎 닀음곌 같읎 볎음 것입니닀.

따띌서 읎 ì ‘ê·Œ 방식을 사용핎서는 안 된닀고 생각하는 몇 가지 읎유가 있습니닀.

  1. 필요한 범위 선택은 새로욎 특성읎 필요할 만큌 충분히 찞신하며 특히 가장 음반적읞 범위읞 Range 제왞합니닀.

  2. 우늬는 읎믞 RFC 프로섞슀에서 여Ʞ까지 왔고 읎것윌로부터 표쀀읎 얻는 유음한 것은 .max() 또는 .min() 륌 작성하는 또 닀륞 방법입니닀. 나는 우늬가 읎믞 Rust에서 할 수 있는 것을 구현하Ʞ 위핎 RFC륌 프로섞슀의 시작 부분윌로 되돌늬고 싶지 않습니닀.

  3. 아직 졎재하는지 확싀하지 않은 사용 사례륌 수용하Ʞ 위핎 핚수에서 발생하는 분Ʞ의 양을 두 배로 늘늜니닀. 읎것을 벀치마크에 표시할 수 없습니닀.

펞잡 큮랹핑 작업의 필요성

... 읎것에서 표쀀읎 얻는 유음한 것은 .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 륌 지원하렀멎

    1. 구현을 T: PartialOrd 합니닀. (나는 확신 읎유는 현재 구현 아니에요 clamp 에 Ord 대신 PartialOrd . 얎쩌멎 ë‚Žê°€ 토론에 뭔가륌 놓친? 귞것은 볎읞닀 PartialOrd 읎멎 충분합니닀.)

    2. 또는 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 제왞합니닀.

    • @jturner314에서 제공하는 새로욎 구현을 사용하여 읎제 배타적 범위에 대한 값을 올바륎게 반환하Ʞ 위핎 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 제안읎 췚소되었습니닀.

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉