Rust: RFC 2126の远跡の問題パスず可芖性を明確にしお合理化する

䜜成日 2017幎09月17日  Â·  120コメント  Â·  ゜ヌス: rust-lang/rust

これは、RFC「パスず可芖性を明確にしお合理化する」rust-lang / rfcs2126の远跡の問題です。

手順

  • [] RFCを実装したす。 さたざたな実装手順は、サブむシュヌに分割されたす堎合によっおは、サブむシュヌに分割されたす。
  • [] crateが絶察パスを開始するこずを蚱可するず、䞀郚の実装の問題がブロックされたす。 次の拡匵機胜を䜿甚しない限り、これらの項目はいずれも有効になりたせん。
  • []ドキュメントを調敎したす forgeの説明を参照
  • []安定化PR forgeの説明を参照

未解決の質問

  • 移行にどのように取り組むべきですか 提案されおいるように、フォヌルバックを介しお、たたぱポックを介しお rustfixツヌルを手にした埌など、より倚くの経隓を積んでこの決定を行うのがおそらく最善です。

  • 絶察パスの最終的な構文。 さたざたなオプションを実際に詊すこずができる状況で、ここで行うべきバむクシェディングは他にもありたす。 特に、 crate::ずextern::䞡方のパスを䜿甚するこずにはいく぀かの実際の利点がありたすが、理想的には、より簡朔な方法でそれを行うこずができたす。

B-RFC-approved C-tracking-issue E-needs-mentor T-lang WG-compiler-front

最も参考になるコメント

これは、可芖性修食子ずパスの䞡方でcrateキヌワヌドを組み合わせた、私が遭遇した別のむンスタンスです。これは、 crate use crate...むンスタンスよりもさらに可胜性が高いようです。

電流

pub(crate) struct Bar {
    pub(crate) foo: ::Foo,
}

pub(crate) struct Baz(pub(crate) ::Foo);

この远跡の問題からの倉曎

crate struct Bar {
    crate foo: crate::Foo,
}

crate struct Baz(crate crate::Foo);

私は個人的に、新しいものが珟圚の方法よりも混乱しおいるず感じおいたす。

党おのコメント120件

そのRFCには4぀の異なる機胜がありください。

@ retep998 RFCの説明党䜓で説明されおいるように、これらの機胜はグロヌバルな蚭蚈䞊の考慮事項を通じお接続されおいたす。 たずえば、クレヌトの名前を倉曎するための倖郚メカニズムを提䟛するこずは、最終的にextern crate廃止されるこずによっお郚分的に動機付けられたす。 さたざたな偎面を個別にゲヌトするこずができたすたた、異なる構文を詊すためにいく぀かの重耇するゲヌトがある可胜性がありたすが、党䜓的な蚭蚈ず安定化に぀いお議論するには、グロヌバルな䞀貫性を念頭に眮くこずが重芁です。

朚枠の名前を倉曎するための倖郚メカニズムを持぀こずは、すでに䜕幎にもわたっお望たれ、必芁ずされおおりhttps://github.com/rust-lang/cargo/issues/1311、単独で問題なく動䜜する可胜性がありたすが、代わりに䜿甚されおいたすextern crate殺害をサポヌトするポヌンにすぎたせん。

これたで、密接に関連する機胜に察しお個別のRFCを䜿甚するこずに問題はありたせんでしたが repr(align(N))ずrepr(packed(N))のRFCが思い浮かびたす、今ではfoo/mod.rsを倉曎するず䞻匵しおいたす。 foo.rsはextern::ずcrate::ず密接に関連しおいるため、同じRFCに属し、同じ远跡の問題を䜿甚する必芁がありたすか

これは構文の未解決の質問の比范的埮劙な偎面であるため、この点に泚意しおください。可芖性修食子およびパスプレフィックスずしおcrateを䜿甚するず、 crate ::absolute::pathずcrate::relative::path 。 コンテキストキヌワヌドを䜿甚するず、同じあいたいさが生じたす。可芖性修食子ずしお実際に意味のある予玄キヌワヌドは他にありたせん。

したがっお、少なくずも crate可芖性修食子を省略し、既存のpub(crate)を䜿甚しお実隓したいず思いたす。

foo.rs / foo/mod.rsポむントを別の远跡問題に分割しおもかたいたせん。これは、パスず可芖性修食子の倉曎ずはたったく無関係に芋えるためです。

限り倖郚クレヌトリネヌムずしお...すでにそれ甚に別の問題があるのでしょう同様にそれの眰金はこの1぀の䞀郚であるず思いたすので、それはパスの倉曎のためにかなり重芁です。

可芖性修食子パスプレフィックスではないずしおのcrateの遞択に関しお数週間前に倚くの議論がありたしたが、このキヌワヌドの遞択が「未解決の質問」ずしおリストされおいたにもかかわらず、私はがっかりしたした。 RFC、それは明らかに今忘れられおいたす。 私自身、および私が指摘した他のいく぀かの人は、この遞択は圢容詞/修食子ではなく、あいたいになる可胜性があるため、混乱を招きたす。 crateは、クレヌトのパブリックAPIの䞀郚を意味したすか 番号 これは、クレヌトに察しおlocalたたはinternalたたはpub 掗緎されたを意味したすしたがっお、埌者のキヌワヌドを奜む理由。 したがっお、私は即時の倉曎を芁求しおいたせんが、少なくずもこの远跡の問題では未解決の質問であるこずを認め、安定化の際に忘れられないようにしたす。

このモゞュヌルの再蚭蚈がこれたでに進んだこずは玠晎らしいこずですが、同時に、「impl期間」を䜜成するためだけに倱敗せず、Rustナヌザヌの倧倚数に盞談せずに決定を䞋すこずが重芁です。 そしお、残念ながら、Github RFCの議論に関䞎しおいる人々は、ナヌザヌベヌス党䜓を代衚しおいるわけではないず思いたす。情報/コメント/意芋が殺到しおいるため、萜胆する可胜性がありたす。 だからどういうわけかそれも察凊する必芁がありたす。

実装がどのように終わったかは明らかではありたせん...

@rpjohnst @ retep998 foo.rs + foo/に぀いお議論し、このRFCのいく぀かの改善を提案するために、新しいRFCを開きたした。

線集可芖性修食子ずしおcrateに぀いお議論するために、別のRFCを開くこずをお勧めしたす。 個人的には反察のこずを望んでいたす。 pub(extern)が远加され、倖郚で公開されおいるすべおのシンボルに必芁です。 これにより、裞のpub pub(crate)は、次の゚ポックの

@rpjohnst

クレヌト::絶察::パスずクレヌト::盞察::パスの間に解析のあいたいさを導入したす

ずにかくcrate ::relative::path無効なコヌドではありたせんか 解析䞭に拒吊するこずはできたせんか

@ est31いいえ、解析䞭に名前解決を行う必芁がありたすが、これは絶察にやりたいこずではありたせん。 これは、CおよびC ++の解析で最も厄介な郚分のひず぀であり、 a * bが乗算たたは宣蚀であり、 a b(c, d);が倉数宣蚀たたは関数プロトタむプであるずいう同様のあいたいさがありたす。

同じ名前の䟝存関係ずトップレベルモゞュヌルを蚱可し始めた堎合、名前解決を解析ず組み合わせおも節玄できたせんcrate :: some :: itemはcrate -visible itemなる可胜性がありたすsome 、たたはプラむベヌトitem最䞊䜍モゞュヌルからsome 。

これを芖野に入れおおくために、あいたいさをいずれかの方法で任意に解決し、他のケヌスおそらく最もたれに芋えるcrate -visibility絶察パスケヌスを蚘述するために括匧を芁求するこずができたすが、それでもpub(crate)に固執すれば必芁のないフットガンで、構文のあいたいさはすでに解決されおいたす。

クレヌトを可芖性修食子およびパスプレフィックスずしお䜿甚するず、 crate ::absolute::pathずcrate::relative::path間に解析のあいたいさが生じたす。

タプル構造䜓フィヌルドず「むンラむン」絶察パスの䞡方の可芖性がたれであるこずを考えるず、これは小さな問題、IMOです。
珟圚、パスは垞に貪欲に解析されるため、 crate :: x :: yがcrate::x::yを意味するこずは理にかなっおいたす。
反察の意味が必芁な堎合は、 pub(crate) ::x::yたたはcrate (::x::y)を䜿甚できたす。

@rpjohnst @petrochenkov pub ::relative::pathが有効なコヌドであるコヌド䟋を教えおください。 2぀のケヌスのいずれかが無効であるず思うので、あいたいさのすべおを理解するこずはできたせん。

線集これが関連する

@ est31あなたは間違った考えを持っおいるようです-それは盞察パスに関するものではなく、決しお問題ではありたせん。 名前が䜕を指しおいるのかを知る前に、ASTを構築するこずです。 完党なサンプルは次のずおりです。

struct S(crate :: x :: y);

これらの名前をただ怜玢するこずが蚱可されおいない堎合、その文字列をASTに倉換するにはどうすればよいですか。 考えられる答えは2぀ありたす。 1぀には、珟圚のクレヌトのモゞュヌルxで定矩されたタむプyプラむベヌトフィヌルドがありたす。 もう1぀は、䟝存関係の最䞊䜍x定矩された別のタむプy crate可芖フィヌルドを持っおいたす。 マクロは必芁ありたせん。

@rpjohnst明確にしおくれおありがずう。 その確かにあいたいさ。

@rpjohnst

簡単な解決策は、クレヌトの可芖性修食子に察しお明確に解析するように定矩するこずです。 指定されたタむプのプラむベヌトメンバヌを持぀タプル構造䜓ずしお解析する堎合は、次のようにしたす。

    struct S(:: crate :: x :: y);

ルヌト '名前空間'を瀺す::プレフィックスに泚意しおください

これは、サブモゞュヌルで他のルヌト名前空間を参照する必芁がある方法ず䞀臎しおいたす䟋 ::std::x::y 。

crate -as-a-visibilityに曖昧さをなくすだけでも、いくぶん驚くべきこずだず思いたす。 ただし、この回避策を少し「正芏化」しお、 crate::が垞に先頭の:: もちろんuse以倖で䜿甚されるようにするこずをお勧めしたす。 ご指摘のずおり、これにより::std::x::yようなパスずの察称性が高たり、真に盞察的なパス self:: / super:: / something_in_scope::プレフィックスなしの圢匏が残りたす。

これを行う必芁がありたすか useパスでcrate::x::yを蚱可するず、 crateは魔法のようなものになりたすが、 ::crate::x::yを適甚するず、䟝存関係ず同じレベルにスコヌプされたす。ずにかく暗瀺しようずしおいる。

@rpjohnst

crate::が垞に先頭の::ずずもに䜿甚されるようにしたすもちろん䜿甚以倖

これは、少なくずも最初は合理的かもしれたせん埌でこれをリラックスするこずを劚げるものは䜕もありたせん。

私はuse extern::bar::fooたたはuse crate::bar::foo構文のファンではありたせん。 ずおもうるさいようです。 これには砂糖がいいです。 これにはextern bar::fooをお勧めしたす。

もう1぀の暗黙のルヌルを远加するのはどうですか extern crateをルヌト名前空間に自動的にむンポヌトし、より䞀臎するパス匏を䜜成したす私は英語が苊手です。plsは次の䟋から私の芋解を孊びたす

䟋えば

  1. このようなプロゞェクト構造

src
| --lib.rs
| --foo.rs
| --foo
| ---- | --bar.rs

  1. Cargo.tomlで䟝存関係を蚭定したす。
    [dependencies] serde = "3.0.0"

  2. mod barをmod fooに远加し、mod fooをlib.rsに远加したす。

  3. lib.rsで関数finlibを定矩し、foo.rsで関数finfooを定矩し、bar.rsで関数finbarを定矩したす。

extern crateのスコヌプをcrateのトップレベルモゞュヌルずしお䜜成するず、このようなコヌドをどこにでも蚘述できたす。

完党/修食パスの堎合

::serde::Deserialize
::serde::x::y
::finlib                            // not ::crate::finlib
::foo::finfoo                   // not ::crate::foo::finfoo
::foo::bar::finbar           // not ::crate::foo::bar::finbar

このように盞察パスを曞く

serde::Deserialize      // no need to write `use serde`
serde::x::y                   // no need to write `use serde`
finlib                          
foo::finfoo                  
bar::finbar       

ルヌト名前空間たで、supper modでルックアップが芋぀からない堎合は、最初に珟圚のmodスコヌプでserdefinlibfooをルックアップしたす。 名前の競合がある堎合は、代わりに完党なパスを蚘述したす。

たた、foo.rsでself::bar::finbarを䜿甚しお、名前の怜玢を回避するこずもできたす。

これに぀いお説明した以前のスレッドを芋぀けるこずができたせんが、コンパむラヌはそのように機胜しおいたため、名前解決に倧きな問題が発生したした。 IIRC @ pcwaltonたたは@ arielb1はおそらくもっず知っおいたす。

このあいたいさに察する最も簡単な解決策は、クレヌトロヌカルの可芖性修食子に別のキヌワヌドを䜿甚するこずではありたせん぀たり、 pub(crate)眮換。 たずえば、以前のRFCの議論で䜕床も提案されたように、 local 。 その堎合、 struct S(local :: x :: y)はstruct S(crate :: x :: y)ずは異なりたす。

これは、 <visibility> <absolute path>ず<relative path starting with the new keyword>間に別のあいたいさをもたらすだけです。これは、新しいキヌワヌドがコンテキストに䟝存しおいる必芁があるためです。

@rpjohnstああくそヌ..しかし、それぱポックが解決するように蚭蚈された問題ではありたせんか 䟋珟圚の゚ポックではpub(crate)䜿甚し、次の゚ポックでは、より「人間工孊的」な新しい非コンテキストキヌワヌドを導入したす。

@ neon64はい。ただし、RFCによるず、新しい゚ポックは必芁ないずいう䞻匵です。 その䞻匵は成り立たないようです。

珟圚、 crate可芖性たたはcrate::パスを䜿甚するコヌドはないため、新しいコヌドのみが圱響を受けたす。 解像床を遞択しおそれを維持する限り、互換性の問題はありたせん。

私に起こったこずの1぀は、以前にディスカッションの1぀で取り䞊げられたこずがある堎合は、お詫びしたす最埌のカップルで芋たこずはありたせん。

最新の提案では、「このクレヌト内」を参照するためのcrate::ず、「このモゞュヌル内」を参照するためのself::がありたす。 これは少し䞀貫性がなく、朜圚的にそれよりも明確ではありたせん。たずえば、 selfが「これ」を指す堎合、本質的に「これは䜕」であるself::があるずいう事実からも明らかではありたせん。 このモゞュヌル」を意味し、 crate::は「他のクレヌト」を意味する可胜性があるず掚枬されるかもしれたせん。これは、実際にはスレッドで蚀及されおいる混乱です。

䞀぀の可胜な解決策は、段階的に廃止するこずですself::の賛成でmod:: 。 次に、「最も近い囲み箱の䞭」を意味するcrate::ず、「最も近い囲みモゞュヌル内」を意味するmod::があり、明確で䞀貫性がありたす。 たた、 fn::プレフィックスを導入するこずで、 fnスコヌプ内のアむテムを修食された方法で参照できないずいう問題を解決できる可胜性がありたす。これは、圓然のこずながら、「最も近い囲みのfn "。 さらに先に進むこずが理にかなっおいるのかどうか、たたtrait::やimpl::ようなものがあるかどうかに぀いおは考えおいたせん。

@glaebhoerlそれは興味深い提案です。 個人的には、絶察パスに新しい構文を導入し、

パスに次の文法があるず想像しおください。

Path = AbsolutePath | RelativePath
AbsolutePath = 
    | `@` ID? 
    | `@` ID? `::` RelativePath
    | `self` :: RelativePath
    | `super` :: RelativePath
RelativePath = ID (`::` ID)*

この文法では、 @crateで始たる他のクレヌトからのものを参照したす。たずえば、次のようになりたす。

use <strong i="13">@std</strong>::collections::HashMap;

たずえば、 @だけでロヌカルクレヌトを参照したす。

use @::something::in::my::crate;

そしお、 use self::somethingは、良くも悪くも、今日ず同じたたです。

これの良い点は、絶察パスが盞察パスず完党に区別されおいるこずです。぀たり、 useからコヌドにパスをコピヌしお貌り付けるこずができるずいう望たしいプロパティがあり、それが機胜したす。

fn foo() {
    <strong i="24">@std</strong>::cmp::min(a, b) // OK
}

これは今日は真実ではなく、それは間違いなく時々私を混乱させたす。

たた、 crate呚りの解析のあいたいさを排陀するので、 pub Foo(crate @::MyType)などを実行でき、正垞に機胜したす。

䞀般に、盞察パスず絶察パスを同じ::開始するこずは、䜕床も苊痛の原因になっおいたすが、それは真実です。

私が知らないこずの1぀は、 @fooが最高かどうかです。 私がうたくいくず思う、そしお私が考えた他のオプションは[]です

  • [std]::collectionsず[crate]::collections // []::collectionsは奇劙すぎるようです。

パスのためだけに新しいシゞルを導入するべきではないず私は本圓に思いたす。 䞀流の匷制::で::crate::fooアドレス@glaebhoerlさんのコメントに十分であるず解析をあいたいさを排陀したす。 たた、 crate::の意図されたメンタルモデルにより密接に適合したす。これは、 self::ようなパスプレフィックスではなく、珟圚のクレヌトの名前の代甚です。

䞀般に、盞察パスず絶察パスを同じ::開始するこずは、䜕床も苊痛の原因になっおいたすが、それは真実です。

これが䜕を意味するのかわかりたせん。 ::で始たる盞察パスはないず思いたすか

@nikomatsakis @glaebhoerl私があなたの提案が奜きかどうかに関係なく私は実際には䞡方ず䞀緒に暮らすこずができたす、RFCに固執しおもらえたすか それは倚くの方法で前埌に議論されおきたした、そしお私は再び議論を開くこずが誰にも圹立぀ずは思いたせん。 合蚈82人が最新のRFCのスレッドにコメントし以前はかなりの議論がありたした、倚くの人がそれに぀いお非垞に匷く感じおいたす。 倉曎を怜蚎する機䌚を䞎えずに、この時点で提案の土壇堎での倉曎をこっそりず行うこずは、圌らにずっお䞍公平だず思いたす。
特に、44721 @nikomatsakisで、「実装に぀いおのみ話したしょう」ずいう匕数で機胜に関する議論をシャットダりンしたため、少し混乱しおいたす。

@衚蚘ず[]衚蚘の䞡方が提案されおいたすが私は䞡方のサポヌタヌです、ナヌザヌからの吊定的な反応のために、少なくずもそれは私の印象ではありたせんでした。 。

先頭の::が、先行する識別子で始たり、内郚に::があるパスず混同される可胜性がたったくない堎合でも、芖芚的にはあたり明確ではありたせん。

たた、それはあたり瀺唆的ではありたせん。 @はより良いニヌモニックです。 先頭に::堎合、先頭にある/ルヌトを意味するファむル名パスに䌌おいるのかUnixyシステムを䜿甚しおいる堎合、それずも先頭にない暙準の省略圢になっおいるのか疑問に思う必芁がありたす。 「盞察的な名前なので、名前を省略した」ずいう意味です。 少し考えおみるず、前者の方が理にかなっおいるこずがわかりたすが、芁点は少し考えおみるずいうこずです。 @ たたはそのようなものは、コンパむラヌずコヌダヌの䞡方で即座に区別できるため、䜕が起こっおいるのかを即座に把握しやすくなりたす。

先頭の@は、先頭の::よりもどのように区別し::は、RustずC ++の䞡方ですでに確立されたメカニズムです。

@ rpjohnst-私はあなたが応答しおいるたさにその文の䞭でどのように蚀ったか @は芖芚的に区別されたす。 拡匵するにはそれはあなたに飛び出したす。 トヌクンストリヌムのメンタルモデルで、リヌディングず内郚のポゞショニングが混同される危険はありたせん。

@はたったく新しいトヌクンであり、たったく意味がなく、理解するには「䞀瞬の思考」よりもはるかに倚くの時間がかかりたす。 先行する::を内郚の::ず混同するこずは、そもそも問題ではありたせん。先行する::は盞察パスである可胜性がありたす。

@rpjohnst - ::意味に぀いお十分なトレヌニングを受けおいれば、あなたの発蚀は真実ですC ++たたはRustの経隓によっお提䟛されたす。 私は孊習可胜性ず本質的な違いに぀いお話しおいたした。 「異なるコンテキストで䜿甚される同じシンボル」は、「䞀意のシンボル」ほど区別できるものにはなりたせん。

@を、蚱容できる代替案があるこのようなナヌスケヌスの䞀意のシンボルずしお燃やす䟡倀はないずいう議論を受け入れるこずができたす。

@Ichoran 特定のセマンティクス @ の新しいトヌクンをRust文法に远加するこずは、軜芖するステップではないず思いたす。 @ nikomatsakisでそれを行うのに近すぎるのではないかず少し疑っおいたす。ず他の人の提案。 1぀は、蚀語の寿呜の埌半で別の目的に再利甚できないためですパスがコヌド内で非垞に普及しおいるため、 @トヌクンが倚くの堎所に衚瀺される可胜性がありたす。 たた、Rustコヌドの耇雑さの認識にどのような圱響があるのだろうか。 たずえばC ++に慣れおいない初心者にずっお、Rustは非垞にバロック的で嚁圧的な衚蚘の蚀語であるず私は信じおいたすただし、これに関する研究はありたせん。 今幎の戊略目暙の1぀は、孊習可胜性を最適化するこずであり、Rustの芪しみやすさを掚枬したす。 したがっお、 @空想するずきは、コヌドで目立぀ずいう盎感があるため、これを考慮する必芁があるかもしれたせん @rpjohnstは圓然の質問だず思いたす。 私はこれで䜕を意味するのか十分に明確ですか

私が䞻匵したこずは䜕でも自由に蚂正たたは明確化しおください。なぜなら、私はRust文法に関する議論にそれほど厳密に埓う時間がないからです。

@ est31

私があなたの提案が奜きかどうかに関係なく私は実際には䞡方ず䞀緒に暮らすこずができたす、RFCに固執できたすか

基本的に同意したす。 私は今、倧きな議論に参加したくありたせん-結局のずころ、それは暗黙の期間です -しかし、私は@アむデアを「そこに」眮いお、バックグラりンドで煮蟌んでいたかったのです。 物忘れがちなこずもあり、曞き出すこずで埌で思い出すこずができたす。

私の考えでは、この時点で行うべき正しいこずは次のずおりです。

  • 蚘述されたずおりにRFCを実装したす。

    • 私たちは、䟋えば、のの提案@rpjohnst採甚するこずをお勧めしたす::crate 、それは非垞に小さいデルタのように思えるので、ちょうど解析disambiguityを解決するために、絶察パスのために、そしお実際に党䜓の䞀貫性を向䞊させたす。

  • 䜿甚経隓を積んでください。
  • その間に浮かんできた代替案を念頭に眮いお蚭蚈を再怜蚎し、最終的な安定化の決定を行いたす。

これは私がコメントを曞く぀もりだった粟神でしたが、私はそれを明確にしなかったず思いたす。 おそらく、それをプラむベヌトファむルに保存する方が良かったでしょう。 woman_shrugging

線集たた、 @ず[]が以前に調達されたこずを知っおいたすが、 @::foo衚蚘が珟圚の盞察的なものずしお以前に蚀及されたかどうかは思い出せたせん朚枠。 だから私はそのアむデアの著者であるず䞻匵する぀もりはありたせん。

OTOH、私が蚀及したアむデアは以前に提起されたものではなく、RFCを拡匵したものではありたせん。 たた、「絶察パスの最終的な構文。さたざたなオプションを実際に詊すこずができるコンテキストで、ここで実行するバむクシェディングがさらにありたす。」 問題の本文に未解決の質問ずしお明瀺的にリストされおいたす。 䞀般に、受け入れられたRFCの再蚎蚟を避けるように努めるべきであるこずに同意したすが、この状況は、たずえば包括的範囲での状況に匹敵するずは思いたせんugh。

このディスカッションスレッドも参照しおください。

https://internals.rust-lang.org/t/the-great-module-adventure-continues/6678

グレヌトモゞュヌルアドベンチャヌの別の゚ピ゜ヌドぞようこそ 私たちが最埌に䌚ったずき、私たちの勇敢な冒険家たちは、RFC2126を受け入れお、぀いに䌝説の土地にやっお来たした。 そこで圌らは短い䌑息を取り、Impl期間から始める準備をしたした。 その間、倧倉な䜜業が行われ、実際にモゞュヌルシステムの抂芁が実装されるようになりたした。 しかし、ただ解決すべきいく぀かのやっかいな質問がありたした そしおそれは私たちをこのディスカッションスレッドに導きたす。

花の少ない蚀語で実装期間䞭に、「パスず可芖性を明確にしお合理化する」RFCおよび関連する倚くのRFCの実装で倚くの進歩を遂げたした。 実際、私たちはほずんど進歩しすぎおいたした。いく぀かの異なるバリアントを実装したした。私たちが本圓に望んでいるこずに぀いお話し合いを始めたいず思いたす。

い぀かこの玠晎らしい䜜品を安定させたいず思っおいたす=そしおそれは私たちが倉皮の1぀を遞ぶこずを芁求するでしょう...それ故にスレッド。

個人的には、@ nikomatsakisが蚀及しおいる@構文のファンです。 それは簡朔で、合理的に自明です。 私たちは、ここに新しい構文の導入いく぀かの䞊べ替えを持っおいるような予玄名よりもずおも良く、特殊な文字぀もりだcrate ぐふを。

特にhttps://github.com/rust-lang/cargo/issues/1311が解決されたこずを考えるず、2番目の倖偎のポむンタヌに取り組む立堎にあるようです実際にはすでに閉じおいるはずです。 少しの指導ず、 @ずcrate構文の決定で、これに取り組むこずができるかもしれたせん。 考え

実装されおいない2぀のlintの远跡の問題を远加したした。

小さな互換性の問題があるこずに気づきたした。 extern crate暗黙的にする堎合、その䜜業を行う際に重倧な倉曎が必芁になりたす。 extern crateは、クレヌトを匷制的にリンクしたす。 これは、Cargo.tomlで远加のクレヌトを指定したが、正しくリンクされおいないlib.rsを指定しない堎合に゚ラヌを匕き起こす可胜性がありたすたずえば、panic = unwindクレヌトずpanic = abort、たたは同じシンボルを゚クスポヌトするクレヌト。 これは問題のない砎損であるず刀断したしたか

小さな互換性の問題があるこずに気づきたした。倖郚クレヌトを暗黙的にする堎合、その䜜業を行う際に重倧な倉曎が発生したす。倖郚クレヌトはクレヌトを匷制的にリンクしたす。 これは、Cargo.tomlで远加のクレヌトを指定したが、正しくリンクされおいないlib.rsを指定しない堎合に゚ラヌを匕き起こす可胜性がありたすたずえば、panic = unwindクレヌトずpanic = abort、たたは同じシンボルを゚クスポヌトするクレヌト。 これは問題のない砎損であるず刀断したしたか

これたで私が芋た唯䞀の解決策は、クレヌトから䜕かをむンポヌトするずきに、クレヌトを暗黙的にリンクするこずだけですが、これにはただいく぀かの問題がありたす。 特定のネむティブラむブラリにリンクしたり、 #[no_mangle]シンボルを゚クスポヌトしおネむティブラむブラリの䟝存関係を解決したりするなど、むンポヌトする錆のシンボルを単に゚クスポヌトする以倖の方法で、クレヌトが機胜を公開する方法はたくさんありたす。 extern crateが削陀されたら、そのようなクレヌトを匷制的にリンクさせる唯䞀の方法は、必芁に応じおむンポヌトするプラセボラストシンボルを゚クスポヌトするこずです。 extern crateに固執するので

ええ、Firefoxではこのパタヌンを明瀺的に䜿甚しおいたす-リンクする必芁があるクレヌトのextern crateステヌトメントを含むトップレベルのgkrustクレヌトがありたすこれらはFirefoxが呌び出すRustで蚘述されたextern C関数を公開したす

これを匷制するためにlib.rsでuse cratename;を芁求するこずでそれを機胜させるこずができたす。

この目的のために#![link_crates(stylo,webrender)]属性を持぀のはどうですか extern crateずは異なり、名前ツリヌにクレヌトは远加されたせん。 新しい名前を付けるず、リンク甚のクレヌトのみを含め、ステヌトメントを削陀しおはならず、 extern crateを削陀する必芁があるこずを読者に明確に瀺したす。

それは反察の問題を解決したすか

ああ、そうですね、2015幎の゚ポックの人々にずっおは、゚ポックを切り替えるこずなくコヌドをアップグレヌドできたす。

ただし、これは、_å…šå“¡_がlink_cratesキヌを䜿甚する必芁があるこずを意味したす。 それは理想的ではありたせん。

この目的のために[link_cratesstylo、webrender]属性を持぀のはどうですか externクレヌトずは異なり、名前ツリヌにクレヌトを远加したせん。

リンクのみのクレヌト、Rustシンボルの付いたクレヌト、たたはその䞡方ずしお䜿甚できるクレヌトはどうですか

@whitequarkこれらのクレヌトのシンボルを䜿甚するず、珟圚のように無料でリンクを取埗できたす。 属性は䜿甚サむトにあるため、ナヌザヌがクレヌトの䜿甚方法を決定したす。

@Manishearth

ただし、これは、党員がlink_cratesキヌを䜿甚する必芁があるこずを意味したす。 それは理想的ではありたせん。

いいえ、私は自分の提案を十分に衚珟しおいたせん。 use cratename::item;がlink_cratesず同じ効果を持぀郚分をそのたたにしおおきたい。 link_crates機胜は、クレヌトからのアむテムは必芁ないが、リンクは必芁な堎合にのみ䜿甚する必芁がありたす。 クレヌトからアむテムをむンポヌトするず、RFCが提案したようなリンクが埗られたす。

その目的のためにコヌドにuse cratename;を含めるこずは、lintず最も重芁なコヌドリヌダヌ/ラむタヌを混乱させるため、良いずは思いたせん。したがっお、その正圓なものに専甚の機胜が必芁だず思いたす。 ただし、めったにありたせんナヌスケヌス。

@ est31 link_cratesの構文に぀いお、属性ずしお䜿甚する代わりに、 extern crate foo;ようなこずをしおみたせんか

@ retep998
良いアむデア 笑顔
https://github.com/rust-lang/rfcs/pull/2166は、リンクのみのクレヌトのスコヌプ/モゞュヌルにクレヌトの名前を持ち蟌たないようにするために、 extern crate foo as _;を導入したした。

@ est31 link_cratesの構文に関するバむクシェディングでは、属性ずしお䜿甚する代わりに、extern crate foo;のようなこずをしおみたせんか

ただし、重芁なのは、長期的にはextern crate構文を取り陀くこずです。

@alexregポむントは、䞀般的なケヌスでは䞍芁にするこずです。 これは、完党に根絶する必芁があるずいう意味ではありたせん。おそらく、Rustアむテムを䜿甚せずにリンクする必芁がある、クレヌトの゚ッゞケヌスの優れた゜リュヌションである可胜性がありたす。 ずにかく、コンパむラが叀い゚ポックをサポヌトしおいる限り、それは存続したす。

@SimonSapinしかし、先に進むず、それが゚ッゞケヌスになる堎合は、おそらく特別な構文を䜿甚するこずは意味がなく、属性䞊蚘で提案したようにの方が意味がありたす。

ここではただuse fooたたはuse foo as _で十分だず思いたす

@Manishearthに同意したす。

extern crate;に関する私の芋解を芁玄するず

利点

  • extern crateは、ラむブラリの䞀番䞊にある䜿甚枈みの朚枠の包括的なリストを提䟛したす。 そこCargo.tomlですが、䟋を持っおいる堎合、それはあなたにむンポヌトする朚枠のリストを䞎えるず、これは非垞に有甚であるずしお、今、通垞の朚箱で、これはその関係ありたせん。 考えおみおください。䟋で開発䟝存関係のサブセットをむンポヌトした堎合はどうでしょうか。 これは、新しいクレヌトのAPIを理解しようずするずきに高いメリットがありたす。これは、孊習可胜性のメリットずも呌ばれたす。 䞀方、 extern crateは朚枠のどこにでも衚瀺される可胜性があるため、リストを網矅する必芁はありたせんが、たずえば、これはあたり関連性がありたせん。 必芁に応じお、倖郚クレヌトをクレヌトルヌトでのみ機胜するようにい぀でも倉曎できたす。

短所

  • extern crateは、クレヌトを远加するずきに入力するものが増えるこずを意味するため、小さな煩わしさです。 これが倚くの人がextern crate反察しおいる理由だず思いたすが、私にずっおはそれがやる気を起こさせる理由ではありたせん。
  • extern crateは取匕の䞀郚であるず思いたす。 extern crateを攟棄したすが、独自のクレヌトからのむンポヌトず実行䞭のクレヌトからのむンポヌトを区別できたす。 これははるかに䟿利な機胜であり、コヌド䟋/テストでの孊習可胜性の欠点をIMOよりも䞊回りたす。 これが、私がextern crate削陀に同意する動機付けの理由です。

extern crateは、ラむブラリの最䞊郚にある䜿甚枈みクレヌトの包括的なリストを提䟛したす。 通垞のクレヌトでは、Cargo.tomlがあるため、これはそれほど重芁ではありたせんが、䟋がある堎合は、むンポヌトするクレヌトのリストが衚瀺されるため、これは非垞に䟿利です。

これがここでの議論にどのように関連しおいるかわかりたせん。 これは、すでにマヌゞされおいるRFCに察するポむントです。

@Manishearth私はここで@ retep998にもっず返信しおいたした。 いいえ、ポむントは、すでにマヌゞされたRFCに反しおいるずいう理由だけで、違法たたは無関係ではありたせん。 決定の長所ず短所を反映し、知る必芁がありたす。 たずえば、 lib.rsから倖郚クレヌトを削陀するこずはできたすが、人間工孊ず孊習性の利点のために䜜成者ではなく、ラむブラリのナヌザヌのために hello_world.rsたたにしおおきたす。

あなたが返信するPeterのコメントで議論されおいるのはリンクのみのクレヌトであるため、これは無関係です。 これは、「すべおの倖郚クレヌトを䞀番䞊にリストする」ずいうニッチなナヌスケヌスであり、わずかなメリットです。 特に、リンクのみのクレヌトではない䟝存関係がある堎合これはFirefoxには圓おはたりたせんでしたが、珟圚は圓おはたりたす。

暗黙の倖郚クレヌトをテストに適甚しないこずに぀いおのより䞀般的なポむント特にリンクのみのクレヌトに぀いおではないの堎合、それは興味深いポむントですが、それはもっず倚くなるので、私は本圓に同意したせんコヌドの半分だけで䜿甚されおいるず混乱したす。

ですから、私が間違っおいなければ、ここに残っおいる唯䞀の実装ポむントは48719です。 今それに取り組んでいる人はいたすか そうでなければ、私は行くこずができたす、私は掚枬したす...

はい、50260で詊しおみたす

土、2018幎4月28日には、915 AMアレクサンダヌRegueiro [email protected]
曞きたした

ですから、私が間違っおいなければ、ここに残っおいる唯䞀の実装ポむントは

48719https //github.com/rust-lang/rust/issues/48719 。 誰か

今それに取り組んでいたすか そうでなければ、私は行くこずができたす、私は掚枬したす...

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/44660#issuecomment-385187379 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABivSMyg6L4nQ1O7nMcvY4JCGjWKRiq3ks5ttJWhgaJpZM4PaPWi
。

48722が完了したした。 @ManishearthはOPを曎新しお

@ mark-im @Manishearth https://github.com/rust-lang/cargo/issues/1311も完了しおいるので、そのポむントをチェックボックスに倉曎しおチェックする䟡倀があるかもしれたせん。 でも気になるのですが、Cargoを䜿わないずきのアプロヌチはどうなっおいるのでしょうか 誰もが貚物を避けおいるわけではありたせん...

@alexreg Cargoがrustcにクレヌトの名前を倉曎するように指瀺するために䜿甚するメカニズムは、貚物を䜿甚しおいない人にも同様にアクセスできたす --extern name_rustc_sees=path_to_dep.rlib 。

実際、 https//github.com/rust-lang/rust/pull/47992がリリヌスされた時点で、実装段階党䜓がたもなく終了するようです。 私は䜕かが足りないのですか やるべきこずが残っおいる堎合は、これを進めるのを手䌝っおください。

ええ、それは途䞭です。 私はそれをたずめる必芁がありたす
次の週。

朚、2018幎5月3日には、午前7時51分PMアレクサンダヌRegueiro [email protected]
曞きたした

実装段階党䜓がたもなく終了するようです–い぀

実際、47992https //github.com/rust-lang/rust/pull/47992が着陞し

䜕か足りない 少しでもあれば、これを進めるのを手䌝っお幞せです
やるべきボブが残っおいたす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/44660#issuecomment-386494018 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABivSDYFonDWvxZEdxWXoykroaL2mJPxks5tu8I_gaJpZM4PaPWi
。

@Manishearth良いもの。

@aturonずhttps://github.com/rust-lang/rust/pull/50260が着陞したしたが、すべお実装されおいたすか

RFCの埌に提案された蚈画ぞのリンクを誰かが手に入れたしたか 実際に実装されたものにより近いものですか  --externクレヌトのむンポヌトがプレリュヌドに远加される堎合など

芋぀けた https 

これは非垞に重芁な倉曎であるため、RFCを曎新する必芁がありたすか

通垞、RFCは曎新されたせん。 それらは最終的な仕様ではありたせん。 圌らは
コンセンサス構築ツヌル。

2018幎6月18日月曜日午埌9時43分、誰ですか 自分 [email protected]は次のように曞いおいたす

これは非垞に重芁な倉曎であるため、RFCを曎新する必芁がありたすか

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/44660#issuecomment-398247665 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AABsij-Iwwb7vf4qBrsq9KFFqhuIbkVBks5t-Fc3gaJpZM4PaPWi
。

@ mark-imその談話の投皿はRFCの粟神の䞭にずどたりたす。 RFCの芁玄をその投皿ず比范しおください。詳现はほずんどありたせんが、ほずんど同じです。 チヌムがたったく異なる倉曎を行うこずを決定したRFCがありたしたが、これはそれらの1぀ではありたせん。

それはすべお真実ですが、すべおが1か所にあるずいいでしょう。 私はそのロゞスティックの課題を理解しおいたすが...

🔔🔔 2018幎初頭の

@aturon最埌の曎新、およびモゞュヌル䜜業グルヌプの最埌の䌚議の結果、 https //internals.rust-lang.org/t/the-great-module-adventure-continues/6678/205が䜜成され、具䜓的には「 2぀のバリ゚ヌションを持぀単䞀のコア提案に絞り蟌みたした。」 私の知る限り、それはただ真実でした。 䞡方の実隓をサポヌトするために、毎晩、フィヌチャヌトグルを介しお䞡方を実装したずいう印象を受けたした。

゚ディションは2぀のバリアントのいずれかを遞択し、機胜フラグなしでサポヌトするこずを遞択し、゚ディションガむドに文曞化したようです。 それはどこで議論されたしたか 私の知る限り、モゞュヌルワヌキンググルヌプもlangチヌムもそこに関䞎しおいなかったからです。

2018プレビュヌから構築された新しい提案に぀いおは、 https//internals.rust-lang.org/t/relative-paths-in-rust-2018/7883を参照しおuseステヌトメントずコヌド内のパスの盎接䜿甚の䞡方で同じ名前解決を䜿甚したす。

こんにちは、 ::some::pathずcrate::some::pathセントだけです。䞻に、平易な英語ずしお読みやすく、巊にぶら䞋がっおいる句読点を残さないため、埌者の方が奜きです。

ご芧になり、ここにフィヌドバックを残しおください

これがあなたの意図したこずだずいいのですが。 すべおのpub(crate)がcrateに倉曎された先物クレヌトぞの倧きな倉曎を確認した埌、むンポヌトず可芖性の䞡方でcrateを䜿甚するこずを確信しおいたす。モディファむアは䞍自然で玛らわしいず感じたす。

crate enum Either<T, U> {
    A(T),
    B(U),
}

2぀を䞀緒に䜿甚するず、特に混乱したす。

crate use crate::foo;

私たち党員を切り替えさせようずするlintの問題で述べたように、それは私を非垞に悲しくさせたす。おそらく、サヌドパヌティのlintを実装しお、私が維持しおいるラむブラリで䜿甚するために、反察のこずをしたいず思いたす。 pub(crate)をcrate倉換するこずから。

泚䞀貫性を保぀ために適切ず思われる倉曎の他の郚分に぀いおはコメントしおいたせん。 pub(crate)からプレヌンなcrateぞの倉曎のみです。

@seanmonstar次の゚ディションのプレビュヌでモゞュヌルシステムに远加の倉曎が提案されおいるため、 crate::fooはさらに少なくなるず予想しおおり、 crate use crate::は特にたれにしか発生しないようです。

2018幎の最初のプレビュヌのモゞュヌルシステムでは、クレヌトのより深い参照に察しおもcrate::を曞き蟌む必芁がありたす。 提案されたモゞュヌルシステムでは、あなただけの必芁があるず思いたすcrate:: 䟋えば、foo.rsからlib.rsに、たたはFOO / bar.rsからfoo.rsにあなたのクレヌト内の参照アップのために、しかし、ないあなたのクレヌトでダりン参照のための䟋えば、lib.rsからfoo.rsに、たたはfoo.rsからのfoo / bar.rsたで。 そしお、䞀般的に、再゚クスポヌト pub useたたはcrate useを介しおは、より高いレベルのモゞュヌルのより深いモゞュヌルから䜕かを再゚クスポヌトするこずを期埅したすが、その逆ではありたせん。

したがっお、䞀般的に、 crate use crate::foo;を芋お驚かれるこずでしょう。

それでも、私が取り組んでいるプロゞェクトでは、たさにこのシナリオがありたす。 いく぀かの「䞀般的な」ヘルパヌを含むモゞュヌルがあり、次に基本特性ずコンビネヌタヌを定矩する別のモゞュヌルがありたす。これらはいく぀かの䞀般的なヘルパヌを䜿甚しおいるため、他の郚分で自分自身を助けるために再゚クスポヌトしたす。クレヌト

珟圚

// in filter/mod.rs
pub(crate) use ::generic::{Combine, Func};

// in filters/foo.rs
use ::filter::{Filter, Func};

lintは、これを次のように倉曎するように芁求したす。

// in filter/mod.rs
crate use crate::generic::{Combine, Func};

だから、私は誰も出䌚うこずのない仮説を考え出そうずしおいたせんでした。 本物だ。

@seanmonstarに完党に同意したす。 必芁がない限り、このキヌワヌドをオヌバヌロヌドしないでくださいオヌバヌロヌドしたせん。

ええ、あなたは正しいですが、再茞出は_通垞_バブルアップしたすが、ショヌンが抂説しおいるように、_暪方向に再茞出されるこずも重芁です。 ファむルが非垞にうたく分割されおいるので、これはサヌボメディアクレヌトに察しおも怜蚎しおいるこずですが、これは、すべおのノヌド実装で倚くの䞀般的なむンポヌトを意味したす。

モゞュヌルで䜕が䜿甚されおいるかを宣蚀し続けるこずは可胜であり、おそらくクレヌト属性ずしお明瀺的に䜿甚する必芁がありたすか ゜ヌスファむルを芋お、その範囲内にあるものを知るこずができるようにしたいず思いたす。 ゜ヌスファむルの先頭にルヌトレベルのむンポヌトを数行含めるず、スコヌプ内にすべおの倖郚䟝存関係を暗黙的に含めるのではなく、゜ヌスファむル内で実際に行われおいるこずのコンテキストを提䟛するのに圹立ち、リファクタリング時に非垞に圹立ちたす。

私の箱の1぀で倉換を詊したので、これに぀いお話しおいるのを芋た他の人のように、 pub(crate)代わりにcrateを可芖性修食子ずしお䜿甚するこずに確信が持おたせん。改善。 ここでの私の掚論は、クレヌトモニカが非垞に広く䜿甚されおおり、アむテムの前に貌り付けるだけで少し厄介になるずいうこずですJavaのpublic static void main()などの䞀郚の蚀語で埗られるキヌワヌドスヌプを思い出させたす-少なくずもRustの最埌にはリタヌンタむプがありたす。 pub(crate) 、少なくずもpubを保持しお、 crateがこのコンテキストでの可芖性を扱っおいるこずをより明確にしたす。

これは、可芖性修食子ずパスの䞡方でcrateキヌワヌドを組み合わせた、私が遭遇した別のむンスタンスです。これは、 crate use crate...むンスタンスよりもさらに可胜性が高いようです。

電流

pub(crate) struct Bar {
    pub(crate) foo: ::Foo,
}

pub(crate) struct Baz(pub(crate) ::Foo);

この远跡の問題からの倉曎

crate struct Bar {
    crate foo: crate::Foo,
}

crate struct Baz(crate crate::Foo);

私は個人的に、新しいものが珟圚の方法よりも混乱しおいるず感じおいたす。

pub(crate)をcrateに倉換するためにRFCを最初に読んだずき、それは簡単に聞こえるず思いたした。 pub(crate)は、この領域の関連するRust構文の残りの郚分ず比范しお非垞に奇劙に芋えたす。

しかし...

埌少しピストンゲヌムを倉換錆2018にし、それを最初に手を芋お、私はsおよび他のコメント」@seanmonstarに同情的だ認めなければならないこず持぀裞crateどこでも振りかけ認知耳障りたした。 時間が経぀に぀れお自然にこれに慣れるかどうかはわかりたせん。

他の人が蚀っおいるように、キヌワヌドは䞡方の文脈で非垞に異なる䜕かを意味しお感じたす。

use crate::menu::{Sound, Volume};

crate mod color;

...

/// A type for storing text and an associated color it should
/// be drawn as.
crate struct ColoredText {
    crate color: types::Color,
    crate text: &'static str,
}

この提案の残りの郚分モゞュヌルシステムの曎新が本圓に奜きであるこずを明確にしたいず思いたす。

pub(crate)は少し手間がかかり、奇劙に思えたすが、裞のcrateも少し違和感を芚えたす。

crateを再利甚する代わりに、ここで別のキヌワヌドを怜蚎できたすか

@ neon64提案されたinternalは劥圓に聞こえたすが、他にもある可胜性がありたす。 Rust 2018でキヌワヌドを远加できるので、これを怜蚎する機䌚がありたす。

internalは私にはpub(crate)より重いようです。 短くはなく、新しいキヌワヌドです。

intどうですか P

内郚 ins 、内郚 int 、保護 pro 、ロヌカル loc 、秘密 sec 、内偎 inn  crateキヌワヌドに代わるものはたくさんありたす。

しかし、 intはC / C ++開発者を混乱させるでしょうか 敎数キヌワヌド

プログラマヌずしお、あなたがパブを芋るずき、あなたはそれをパブリックずしお扱いたす、あなたが別の可芖性レベルを導入したいなら、あなたはそれが䞀貫性を保぀ために圢容詞である必芁がありたす。 私が芚えおいる限り、パブは最初は公開の略であり、どちらの堎合もパブクレヌトはより自然に感じたす。 クレヌトはそのための奇劙なキヌワヌドです。
pubcrateはそのたたにするか、圢容詞の略語を远加したほうがいいず思いたす。

たた、名前付けの難しさは、パブが略語であるずいう事実にあるず思いたす。それが公開されおいれば、プラむベヌトたたは内郚ず呌んで忘れおも問題ないず思いたす。

個人的には、 pub(crate)の問題は芋圓たりたせん。 構文は䞀芋明確で明確であり、実際のRustず䞀臎しおいたす。 これを頻繁に入力する必芁はないので、5回の䜙分なキヌストロヌクが問題になるず思いたす。

@UtherII

pub(crate)短瞮名が必芁な理由は、珟圚䜿甚されおいるpub倚くおそらくほずんどがそれに眮き換えられるためです。

Rust 2018では、効果的にプラむベヌトアむテムにpubを䜿甚するずプラむベヌトモゞュヌルに衚瀺されるため、譊告が衚瀺されたす。 代わりに、そのようなアむテムにはpub(crate)を䜿甚する必芁がありたす。 この芏則により、コヌドの可読性が向䞊したす。アむテムがpubずマヌクされおいる堎合にのみ、他のクレヌトに衚瀺されたすが、珟圚、他のクレヌトに衚瀺されおいるかどうかは䞀目でわかりたせん。

申し蚳ありたせんが、このスレッドに返信するのではなく、誀っお新しい問題を䜜成したした。 おっず、私はgithubにかなり慣れおいないので、ボタンをクリックするだけで、ここで応答しおいるず思っおいたものにサむンむンしたしたが、実際には新しい問題が発生しおいたした。 新しい号に曞いたものをここに貌り付けたす。新しい号は削陀できたす。申し蚳ありたせん。

版のマニュアルが人々がここにフィヌドバックを残すこずを提案したので、私はそうするこずに決めたした。

クレヌトルヌトから芁玠にアクセスするために、crate ::たたは::のどちらでもかたいたせん。 ::はすでに構文になっおいるので、crate ::ず::の䞡方を䜿甚できる堎合は、䞡方を䜿甚する必芁があるず思いたす。 私の芋方では、パスに関しお新しく提案されたクレヌトシステムは、基本的に叀い構文ず同等ですが、唯䞀の違いは、externキヌワヌドを䜿甚する必芁がなくなり、明瀺的に䜿甚するよりもアクセスしやすくなるこずです。サブモゞュヌルでは、基本的にどこにでも暗黙的にむンポヌトされたす。

他の唯䞀の远加は、クレヌトルヌトを::ではなくcrate ::で開始するこずです。 これは私が最初に孊んだ方法ず䞀臎しおいるので、::だけで始めるのが奜きですが、モゞュヌルシステムをただ孊んでいない人でも、crate ::で始める方が盎感的です。 なぜ䞡方の構文圢匏を蚱可しないのですか 䞡方を持぀こずが䞍可胜になる理由はありたすか 䞡方をサポヌトできる堎合は、䞡方をサポヌトするこずを匷くお勧めしたす。 1぀しかサポヌトできない堎合は、::に慣れおいるのず同じように、初心者の方がクレヌト::ずしお習埗しやすいかもしれたせんが、::の理解を簡単に曎新できたす。そうなるために、おそらく私の動機は利己的です。

だから本質的に、私は最終的にはあたり気にしたせんが、個人的には::を奜みたすが、どちらかを遞択する必芁があり、crate ::から始めるこずが初心者にずっお優れおいるず人々が考える堎合は、䞡方をサポヌトするのが理想的だず思いたす。これに反察しないでください。

#[path]はRust 2018でネストされたモゞュヌルでどのように機胜するこずになっおいたすか https://github.com/rust-lang/rust/issues/35016#issuecomment-409185342

IIUC、珟圚、2぀のファむルsrc/lib.rsずsrc/bar.rsが䞎えられた堎合、次のように眮き換えるこずができるXはありたせん。

mod foo {
    #[path = "X/bar.rs"]
    mod bar;
}

bar.rsぞのパスは垞にsrc/foo/X/bar.rsであるため、モゞュヌルbar.rsが怜出されたす。これは、ディレクトリfooが存圚しないため無効です。

私たちはpub(crate)亀換に適した名前でバむクシェッドを行っおおり、コアチヌムはただフィヌドバックを求めおいるので、私の経隓を共有し、提案を提䟛したいず思いたす。

私が曞いたある朚枠の䞭で、どこでもpub(crate)入力するのpub短瞮し、クレヌトの倖に衚瀺する必芁のない倚くのシンボルを誀っお゚クスポヌトしたした。 おっずっず。 😛私の特定のケヌスでは、クレヌトは内郚にあり、公開されおいないため、実際には問題ではありたせんが、それでも正確さよりも䟿利です。そうです、クレヌトレベルの可芖性を䌝えるには、2぀のキヌワヌドのマッシュアップよりも優れたものが必芁だず匷く信じおいたす。

しかし、 crateがそのキヌワヌドずしお適切であるずは思いたせんこのトピックに関する他の人からのフィヌドバックに぀いおは䞊蚘を参照しおください。他の提案されたキヌワヌドは、問題に芖点からアプロヌチするこずで、ポむントを逃しおいるように感じたす。朚枠の根の; 問題は、モゞュヌルの芳点、぀たりキヌワヌドを含む特定のコヌド行にありたす。 ぀たり、コヌドは「クレヌトの局所性」を提䟛しようずしおいるのではなく、定矩されおいるモゞュヌルから参照を゚クスポヌトしようずしおいたす。

その意味で、私はキヌワヌドexport奜きです externず混同する可胜性があるずしおも、 extern crateが死んでいるので、それは意味がありたせんか export struct Foo;非垞に読みやすく、他のいく぀かの蚀語ishず連携しおいたす。 このRFCたたは他の堎所で、キヌワヌドずしおexport蚀及を芋぀けるこずができたせんでした。 ですから、それもありたす。

完党を期すために、 @ seanmonstar 、 @ johnthagenなどによっお提起されたナヌスケヌスをカバヌしおいたす。

export use crate::generic::{Combine, Func};

// Or even better using relative paths
export use ::generic::{Combine, Func};
export struct Bar {
    export foo: crate::Foo,
}

export struct Baz(export crate::Foo);
use crate::menu::{Sound, Volume};

export mod color;

// ...

/// A type for storing text and an associated color it should
/// be drawn as.
export struct ColoredText {
    export color: types::Color,
    export text: &'static str,
}

そうは蚀っおも、私はpub(crate)を火で殺すこずに賛成です。 私もcrate 、FWIWが奜きです。

@parasyte export芋られる問題は、「このクレヌトは____をpub目的ですず混同される可胜性があるこずですが、あなたがどのように䞻匵しおいるのかはわかりたす別の芖点。

ほずんどの人がpub(crate)は理想的ではないこずに同意しおいるようです。倚くの人が、珟圚他のコンテキストで䜿甚されおいる名詞キヌワヌドcrateが代わりに䞍快感を䞎える可胜性があるずいう懞念を衚明しおいたす。 他の朜圚的に新しいキヌワヌドを十分に怜蚎したこずを確認するこずは、Rust 2018がこれを決定する前に、非垞に良い時間の䜿い方のように思われたす。

しかし、これがただ議論の䜙地がある堎合、私は「公匏の」フィヌドバックを聞いたこずがありたせんか

@parasyteの提案に沿っおさらにいく぀かの単語を玹介するために exportはpub(crate)よりもpubように芋えるずいう@johnthagenに同意し

shared use ::generic::{Combine, Func};
shared struct ColoredText {
    export color: types::Color,
    export text: &'static str,
}
global use ::generic::{Combine, Func};
global struct ColoredText {
    export color: types::Color,
    export text: &'static str,
}

Javaの足跡をたどっお、 protectedようなものを䜿甚するこずもlocal crate-localの意味でもありたすが、 globalは実際には混乱する可胜性が䜎いず思いたすたずえば、 localは_file_-localである可胜性がありたす。

人々はpub(cr)あるいは単にcrどう思いたすか

crateは、芋過ごすには良すぎるようです。 これはすでにキヌワヌドであり、 extern crate以前の䜿甚はなくなりたす。 他の甚途はすでに可芖性pub(crate)関連しおいたす。

圢容詞ずしおクレヌトを䜿甚しお少し目を现めおも、それほど戞惑うこずはありたせん。 「家」などの単語は圢容詞ずしおうたく䜿甚できたす。 IANAEnglishProfessor。

朚枠の目に芋えるアむテムを再゚クスポヌトするこずはそれほど問題ではないず思いたす。 個人的には、それを定矩するモゞュヌルの盎接の芪でアむテムを再゚クスポヌトしたこずがありたす。぀たり、おそらく self代わりにcrate selfを䜿甚したいずいうこずですseanmonstarのコヌド線成の堎合にもかかわらず 。 䟋えば。

    mod detail {
        crate struct Foo;
    }

    crate use self::detail::Foo;

型ぞの絶察パスず組み合わせた可芖性ずしおクレヌトを䜿甚するずここでもseanmonstarの䟋を䜿甚、 pub(crate) struct Foo(pub(crate) ::Foo);ではなくcrate struct Foo(crate crate::Bar);ように芋えたす。 私の唯䞀の垌望は、この構成が人気がなく、したがっお移行しおもこのクレヌトスヌプが䜜成されないこずです。 ナヌザヌは、明瀺的にむンポヌトするこずでこれを回避できたす。

use crate::Bar;

crate struct Foo(crate Bar);

私はshareたたはそのようなものの提案が奜きです。 give 、 provide 、 deliver 、 offer 、 serve 、 post 、 forward .. 。圢容詞でなければならない堎合は、これらすべおに接尟蟞を付けお倉換できたす shared 、 givable 、 providableなど。

少しの間JavaScriptを遞択するために、ES6には、蚀語に組み蟌たれたパッケヌゞずモゞュヌルの抂念すらありたせん。 モゞュヌルしかありたせん。 ES6のexportキヌワヌドは、垞にモゞュヌルから参照を゚クスポヌトしたす。 それを䜿甚したい堎合は、パスによる参照をimportする別のモゞュヌル次第です。

これは倧きく異なるではありたせんpubずuseそれぞれ。 exportキヌワヌドを䜿甚するず、混乱が生じるず思いたす。 pub(crate)は実際には䞀皮のニッチです。 これが、過去にpubを䜿甚するこずを遞択した理由です。 ;

crate可芖性修食子の問題は、53120に抜出されたした。 さらなる議論ず決定はあちらで続けられるべきです。

mod.rs倉曎の問題は、53125に抜出されたした。 さらなる議論ず決定はあちらで続けられるべきです。

extern crate非掚奚の問題、およびuse crate_name::fooずcrate_name::foo JustWork™の問題は、 https//github.com/rust-lang/rust/に抜出されたした

モゞュヌルパスシステムの遞択の問題は、 https//github.com/rust-lang/rust/issues/53130に抜出されおい

この問題からすべおのビットを別々の問題に抜出したした。 これで締めくくりたす。

@Centril  https  //doc.rust-lang.org/unstable-book/print.html#extern_preludeリンクはこちら。 これはどこで議論されおいたすか この情報が実際に欠萜しおいる堎合は、OPに远加できたすか

@ sanmai-NL「externprelude」が䜕であったかに぀いお私の蚘憶をリフレッシュできたすか

use some_crate::foo::bar;を実行する機胜だけの堎合は、 https//github.com/rust-lang/rust/issues/53128になり

その䞀郚はhttps://github.com/rust-lang/rust/issues/54230で議論されおい

@ sanmai-NL問題は䞻に蚺断にあるず思いたす。

extern_preludeあるcrate_name::foo::barの倖use むンポヌト経路。

@Centril

「゚クスタヌンプレリュヌド」ずは䜕かに぀いお、私の蚘憶をリフレッシュしおいただけたせんか

䞀般に、「プレリュヌド」は珟圚、クレヌト党䜓のスコヌプ内にあり、特定のモゞュヌルに接続されおいないすべおの名前に䜿甚されおいたす。 実際にはたくさんありたす。

@petrochenkovでは、それに関連する「

@alexreg
--extern枡されたクレヌトは、特定のモゞュヌルに接続されおいない間、クレヌト党䜓のスコヌプに含たれたす。

これらの情報の塊が、どんなに䞍安定であっおも、公匏のドキュメント゜ヌスに蚘録されおいれば玠晎らしいず思いたす。 Esp。 䞍安定な本のように、抂念の倖郚の蚀及がある堎合。 ただし、これらの抂念を実装するメンテナがそうすべきだず蚀っおいるのではありたせん。

@petrochenkovありがずう、理にかなっおいたす。

この問題からすべおのビットを別々の問題に抜出したした。 これで締めくくりたす。

@Centril珟圚のベヌタ版の問題の远跡リンクはこちら。 人々がコメントを掞窟探怜する必芁がないように、元のコメントを最新の情報で曎新したすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡