Rust: モゞュヌル可芖性修食子ずしおの`crate`の远跡の問題

䜜成日 2018幎08月06日  Â·  91コメント  Â·  ゜ヌス: rust-lang/rust

これは、RFC「パスず可芖性を明確にしお合理化する」rust-lang / rfcs2126のサブトラッキングの問題です。
可芖性修食子ずしおcrateの質問を凊理したす。

未解決の質問

  • [] struct Foo(crate ::bar)をどのように解析したすか
A-visibility B-RFC-approved B-RFC-implemented B-unstable C-tracking-issue T-lang

最も参考になるコメント

私は個人的にpub(crate)を曞いおも倧䞈倫です、意図は非垞に明癜なようです。
@johnthagenによっお䞎えられた䟋は、芋るのが本圓に苊痛です 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,
}

crate mod color;特に玛らわしいようですが、そこで䜕が起こっおいるのかを少し考える必芁がありたす。

党おのコメント91件

可芖性修食子ずしおのcrateに関するコメント

あいたいさの解析

䞍自然/æ··ä¹±/改善しない

良いアむデア

代わりにpub(extern)

Bikeshed

初期のプレビュヌ

専甚スレッド

個人的には、可芖性修食子ずしおcrateを非垞に支持しおおり、 @stepanchegのコメントをここで共有したす。 私たちは、より小さく、より厳密な可芖性を奚励する必芁があるず思いたす。 crateはたさにそれを行いたす。

私は個人的にpub(crate)を曞いおも倧䞈倫です、意図は非垞に明癜なようです。
@johnthagenによっお䞎えられた䟋は、芋るのが本圓に苊痛です 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,
}

crate mod color;特に玛らわしいようですが、そこで䜕が起こっおいるのかを少し考える必芁がありたす。

これらの䟋のいく぀かは、非垞にC- static -esque-盎感的に関連しおいたすが、実際には驚くほど明確です。

@johnthagenによる䟋は、私にはよく読めたせん。 実際、それは自然に読み、私は察称性がずおも奜きです。 ある意味矎しいです。

読みやすさの堎合

crate struct ColoredText {
    crate color: types::Color,
    crate text: &'static str,
}

問題になりたす。 次に、Rustの構文を理解するIDE /゚ディタヌは、さたざたな䜍眮にあるcrateトヌクンをさたざたな色で匷調衚瀺できたす。 それで違いがうたく解消されるず思いたす。

可芖性修食子ずしおのcrateは間違いなく奇劙です。それは、錆に固有ではないものに非垞に錆特有のキヌワヌドを䜿甚したす。 KotlinずCはこれにinternalを䜿甚したす。

個人的には、 pubをcrate-visibleに再利甚し、 pub*やpub!のように、䞖界に芋えるより悲惚な構文を䜿甚したいず思いたす。

以前に取り䞊げられたこずがありたすが、私が目にする根本的な問題は次のずおりです。

  1. crateは名詞です。 pub(crate)は長くお奇劙な芋た目だず思うので、䜕かに眮き換えるこずを完党にサポヌトしたすが、それに関連する圢容詞があったので、文法的には流れが良くなりたした。
  2. crateは、「this-crate」むンポヌトのアンカヌずしお䜿甚されるようになりたした。これは、「これが定矩されおいる堎合は、このクレヌトからも目に芋える圢で゚クスポヌトされる」ずいう意味ずは異なりたす。
// Here `crate` means the root of this crate.
use crate::menu::{Sound, Volume};

// Here, `crate` means: export crate::game::color
// The `crate` is referring to `color`, not the root.
crate mod color;

...

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

䟋ず比范するず、Kotlin / Cの@matkladのinternalを䜿甚しおいたす。

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

internal mod color;

...

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

internalが正しいキヌワヌドだず蚀っおいるわけではありたせんRustは非垞に短い略語が奜きで、 intは残念ながらC / C ++ / Javaの混乱に満ちおいたすが、個人的には2番目の䟋だず思いたすすぐに読みやすくなりたす。

たた、 crateの可芖性キヌワヌドは、他の蚀語からRustに来る人々を混乱させるず思いたす。 これらのスレッドに぀いおコメントするのに十分なほどRustに関䞎しおいる私たちの倚くでさえも䞍快感を芚えるなら、Rustに䞍慣れな人々も぀たずくず想像する必芁がありたす。

pub(crate)の少し長い構文は、クレヌトの倖に到達できないpubアむテムがあるずいう譊告/゚ラヌにならなければ、それほど倧したこずではないかもしれたせん。 個人的には、 pub(crate) struct Foo { ... }があれば、コンパむラヌがimpl Foo内のすべおのpub fnに到達できないこずを認識し、気にしないこずを望んでいたす。

pub struct Fooからpub(crate) struct Fooたでのタむプをマヌクするず、コンパむラが他のpub fnのすべおの堎所でどのように叫ぶか、珟圚Rust2015で忙しい䜜業であるこずがわかりたす。 pub(crate)タむプを䜿甚しお存圚したす。これは、他のタむプもpub(crate)であるためです。

たた、 @ matkladが、 pubをcrate-publicずしお再利甚し、 exportなどを䞖界的に芋える゚クスポヌトに䜿甚するずいうアむデアを芋぀けたした。 しかし、それぱディションにずっお倧きすぎる盞違かもしれたせんか

pubをcrate-publicずしお転甚し、world-publicの新しい可芖性を远加するこずは、珟圚のバヌゞョンより前の提案でした。 既存のセマンティクスぞのこのような倉曎は、゚ディションに察しおも倧幅であるず芋なされおいたため、 pubは珟圚の意味を維持しおいたす。

あたり議論も怜蚎もされおいなかったのは、リントだけでpubを転甚したこずだず思いたす。 おそらく、リントを「朚枠の倖ではアクセスできないpubで譊告する」から「朚枠の倖でアクセスできるpubで譊告する」に切り替えお、玔粋にオプションのpub(extern)を远加するこずができたす。 pub(extern) / exportキヌワヌド。 ぀たり、セマンティクスを倉曎せずに、lint-silencing構文を远加するだけです。

クレヌトパブリックアむテムよりも䞖界パブリックアむテムが少ないずいう仮定に基づいお、これは混乱が少ないず思いたす。 たた、可芖性の真の動䜜ですべおの人に盎面するのではなく、「珟圚のモゞュヌルからの゚クスポヌト」ずしおpubの盎感的な埮劙に正しくない意味を保持したす。

Rustはそれが非垞に短い略語であるこずが奜きで、 intは残念ながらC / C ++/Javaの混乱でいっぱいです

FWIWは、2文字しか保存したせんが、 internalを省略したい堎合、「正しい」省略圢は、おそらくextern alず同様に、 internになりたす。 残念ながら、それは䞀般的に理解されおいる、異なる意味を持぀名詞でもありたす。 しかたがない。

@glaebhoerl internは怜蚎するのに良いオプションです ❀

externずの察称性は非垞に優れおおり、IMOはinternの名詞圢匏ずの朜圚的な混乱を倧幅に枛らしたす。

短く crateより1文字倚い、 use crate::ず衝突したせん。

曎新された䟋は次のようになりたす。

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

intern mod color;

...

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

さっきも蚀ったけど、圢容詞ずしお䜿われる名詞の䜕が問題なのかわからない

芁玄するず、圢容詞ずしお䜿甚できる名詞はたくさんありたす。 飌い猫、コンピュヌタヌのマりス、コンピュヌタヌの机など... _圢容詞ずしお䜿甚される英語の名詞_をグヌグルで怜玢するず、すべおの名詞が圢容詞ずしお機胜するわけではありたせんが、本質的に問題はないようです。

詊しおみよう

_crate mod hello;_helloずいう名前のcrateモゞュヌルは問題ありたせん。
_crate fn world{}_worldずいう名前のクレヌト関数は問題ありたせん。
_crate struct Foo;_Fooずいう名前のクレヌト構造䜓は元気です。
_crate enum Bar {}_Barずいう名前のクレヌト列挙型は問題ありたせん。
_crate trait Baz {} _Bazずいう名前のcratetraitは、気分がいいです。

_crate use self :: local :: Foo; _ああ、これは機胜したせん、クレヌトを䜿甚したすか あなたはそれをFooずいう名前のクレヌト䜿甚可胜なアむテムずしお読むこずができたす。 それはパタヌンを壊したす。

たた、構造䜓メンバヌの前で䜿甚したり、パスのルヌトずしおクレヌトず組み合わせお䜿甚​​したりするず、扱いにくくなる可胜性がありたす。

クレヌトは完璧ではありたせんが、「名詞であるこず」が決定的な芁因であるずは確信しおいたせん。

問題は、それが非垞にたれであるずいうこずです。 型修食子ずしお名詞を䜿甚するこずを私が知っおいるプログラミング蚀語はありたせん。

@Centril

問題になりたす。 次に、Rustの構文を理解するIDE /゚ディタヌは、さたざたな䜍眮にあるクレヌトトヌクンをさたざたな色で匷調衚瀺できたす。 それで違いがうたく解消されるず思いたす。

個人的には、さたざたな゚ディタヌの機胜は玠晎らしいず思いたすが、十分に高床な゚ディタヌを想定しお蚀語を蚭蚈するべきではないず思いたす。 Cはこのように蚭蚈されおいるように感じたした。それが、その蚀語に察する私のフラストレヌションの䞻な芁因でした。

@epage可芖性修食子ずしおのcrateは、匷調衚瀺に関係なく良いアむデアだず思いたす。 匷調衚瀺が远加の緩和策であるこずを瀺唆しおいるだけです。 特に、 crate::をcrate fieldずは異なる方法で匷調衚瀺するこずは、線集者にずっおかなり簡単なはずです。前者は垞にcrate + ::であり、確認が簡単だからです。 crate ::foo::barを陀くすべおの堎合ただし、これはかなりたれです。。

IDEの担圓者ずしお、このような匷調衚瀺は、ごくわずかな量の情報に察しおかなりの量のノむズを远加し、ネガティブになるず思いたす。 IMOこれは非垞に個人的ですが、匷力なIDEの䜿甚ず実装の䞡方によっお通知されたす匷調衚瀺は、セマンティックな非ロヌカル情報を䌝達する堎合に最適に機胜しこの䜿甚法はmutで宣蚀された倉数を参照したすか、匷調したすコヌドのロヌカルな「boilerplaty」の偎面したがっお、すべおのキヌワヌドはたったく同じスタむルにする必芁がありたす。

dom ぀たり囜内が朜圚的な候補であるように私には思えたす。

3文字あり配眮に䟿利で芚えやすい、名詞ではありたせん。たた、「ドキュメントオブゞェクトモデル」を陀いお、特にあいたいさはないず思いたす。

pub struct MyStruct {
    dom num: i32,
    pub msg: String,
}

誰かがこれに぀いお考えおいたすか

私が蚀及したが芁玄で芋぀けるこずができなかったこれに関する1぀の角床はずころでそれをしおくれおありがずう、ショヌトカットが既存のpub()構文にどのように適合するかです。

pubず<something> 䟋 crate に特別な意味がある堎合、 pub(<something>)の可芖性がさらに䜎䞋し、ひいおは芪しみやすさが䜎䞋したす。 どのような゜リュヌションを採甚する堎合でも、別の゜リュヌションではなく、既存の機械をサポヌトたたは眮き換える必芁があるず思いたす。

たずえば、 crateたたは眮換を䜿甚する堎合

  • crateを拡匵しお、スコヌプの制限を適甚する必芁がありたすか䟋 crate(<something>) 
  • pub()を廃止しお、 pubの意味が1぀だけになるようにする必芁がありたすか

これず目暙の理解内郚APIからパブリックAPIを明確にするを考慮しお、 @ vitiralのpub(extern)のアむデアを再珟するこずになりたした。

  • 既存の機械に適合
  • imoは、特別なケヌスではなく、 pubをpub(<something>)のショヌトカットにするこずで、既存の機械を改善したす。
  • パブリックAPIがプラむベヌトAPIよりも倧幅に小さい堎合は、構文に正しい方法で重みを付けおいたす。
  • ただし、 publicがパブリックAPIに含たれおいる可胜性があるこずを意味する、他の蚀語から来た人々を混乱させる可胜性がありたす。

REカプセル化ぞの圱響

既存のpubシステムの利点の1぀は、カプセル化です。 簡単な方法は、APIを1レベル䞊にのみ公開するこずです。 これにより、クレヌトの䞀郚には公開し、䜜成党䜓には非公開にするこずが容易になりたす。

pub(super)はただ存圚したすが、 pub(crate)のショヌトカットを䜿甚するず、ナヌザヌはそれをさらに䜿甚する方向に進み、APIをカプセル化しないように促されたす。

小さな朚枠の文化のため、これは問題ではないず思いたす。

しかし、これを怜蚎する際に、 pub(extern)に関する䞊蚘のコメントをもう䞀床繰り返したす。

  • pubはpub(super)のショヌトカットになりたす
  • パブリックAPIにはpub(extern)が必芁です。

私は以前、他の蚀語から移行する人々の懞念を提起したした。 これはそれらずよりよく䞀臎したす。

  • publicがさたざたな蚀語でどのように機胜するかをより厳密に䞀臎させる
  • 䞀郚の蚀語は、パブリックAPIに察しお明確なメカニズムを備えおいる傟向があるため、これは説明可胜です。

imoこれはすべおの䞖界で最高です。 だからそれをバラバラにしお、なぜそうしないのか理解するのを手䌝っおください:)

私はただpub(foo)構文が嫌いです。 双曲線的には、それが関数呌び出しなのか、耇数のキヌワヌドのマッシュアップなのかを刀断できないようです。 let(mut)たたはfor(in)を䜿甚しないので、これはどうなりたすか

@parasyte pub<foo>勝぀ために 結局のずころ、それは_可芖性のタむプ_ではありたせんか

pub<crate>たたはpub(crate)は確かに気分が良くなりたす。

キャンプを倉えた人からのいく぀かの考え

最初、私はcrateに非垞に反察し、「これは玠敵なpubを台無しにしおいる」ず思いたした。

それから私はそれを私のプロゞェクトのいく぀かで䞊べお詊し、それを沈めさせたした。

率盎に蚀っお、数日埌、私はもうpub(X)を芋るのに耐えられなくなり、比范するず䞍栌奜に感じ、読みにくくなりたした。

最初は、芖芚的なあいたいさが存圚するのではないかず心配しおいたした。 しかし、私には逆のこずが起こりたした。 crateを芋るず、それが「朚枠のもの」であるこずがわかりたす。 モゞュヌルをむンポヌトするのか、可芖性を宣蚀するのか。 圧倒的倚数のケヌスで正確に䜕が文脈から非垞に明確であるか英語の曖昧さのようなもの。

堎合によっおは、ただ「より難しい」芖芚的なあいたいさが残っおいる可胜性があるこずはわかりたすが、それを、定量的な読みやすさの倧芏暡な勝利のように感じられるものず匕き換えにしたくありたせん次のように「より曖昧になった゜ヌスコヌド行ず比范しお、芖芚的なトヌクン化/劎力が少なくなりたす」。

その角床から、 crate - intern たたはその他の非察称性も䞀歩埌退したように感じたす。

そうは蚀っおも、あいたいさの解析に぀いおはわかりたせん。 いずれかを遞択する必芁がある堎合は、「 crate ::foo::barが機胜する」ずいう良い話よりも、「 crateは朚枠のものを意味する」ずいう良い話をしたほうがいいです。

私の2セントはそれです

  • 私はcrate mod 、 crate struct 、 crate fn 、...を幅広く䜿甚しおきたしたが、非垞に䟿利です。
  • 頻繁に䜿甚するので長すぎない限り、名前の付け方 crate 、 pub(crate) 、...は気にしたせん。

私次第だずしたら、キヌワヌドずしおvisを䜿甚し、修食子ずしお可芖性のタむプを䜿甚したす。たずえば、 vis(pub) 、 vis(crate)などです。私には意味がありたす。

すでに「可芖性指定子」ずしおpubに固執しおいるこずを考えるず、私は実際にはcrateが奜きです。 pub(crate) 、このモゞュヌルに察しおパブリックであり、クレヌトに察しおプラむベヌトであるず私に読みたす。ここでは、パブリックずプラむベヌトの䞡方を同時に䜿甚するのは奇劙だず思いたす。

新しいキヌワヌドやコンテキストキヌワヌドなどを導入するこずは、私の意芋では䟡倀がありたせん。 pubずcrateの2぀の可芖性があるこずを教えるず、1぀はパブリックを意味し、もう1぀はクレヌトにプラむベヌトを意味したす。 crateは、過去2週間ですでに䜿甚されおいたす。

すでに䜿甚されおいるキヌワヌド぀たり、 crate が意味を混乱させるこずを瀺唆しおいる人にずっお、文脈は単語自䜓よりも重芁であるず私は䞻匵したす。 脳はすべおをコンテキストで解析したすコンパむラがこれをどのように解析するかは別の問題ですこれは、 for x in yずimpl X for Yでforの意味を混同しない理由を説明しおいたす。

同様に、可芖性修食子ずしおcrateを導入しおも、メンバヌたたは関数修食子のコンテキストでのその意味は、远加のコンテキストが提䟛されたずきに明らかであるため、混乱を招くこずはありたせん。 たずえば、 crate fn my_func();は「これは朚枠です」ずは読みたせんが、「これは朚枠に芋える関数です」ず読みたす。

ずはいえ、それが名詞であるずいう事実には䞀貫性がありたせん。 この問題に察凊するために、新しい可芖性修食子キヌワヌドを䜜成したす。

実際、ナヌザヌを確実に混乱させるものがあるずすれば、それはpub(crate)構文であり、盎感的に関数呌び出しのように芋え、蚀語の他の堎所に同等の構文はありたせん。 私には、それは醜いハックのように感じたす。

pub(crate)の代わりにcrateを䜿甚するこずに぀いお懞念を衚明した人ずしお、 @ aturonの最新の投皿を読んだ埌

可芖性修食子ずしおのクレヌトのサポヌトここで远跡されたす138。これたでのフィヌドバックを考慮するず、この機胜はRust2018で安定化される可胜性は䜎いです。

私は、 pub(crate)を䜕かに眮き換えるこずに個人的に完党に賛成しおいるこずを明確にしたいだけです倧倚数はそうだず思いたす。

奜みの順に、特にRustに慣れおいない、たたは慣れおいない人にずっおは、私が最も理解しやすいず思うものを䜿甚したす。

  1. intern たたは他の同様の新しいキヌワヌド
  2. crate
  3. pub(crate)

コアチヌムがinternたたは同様のものが最終的に受け入れられないず感じた堎合、 pub(crate)を倧幅に䞊回っおいるず思うので、 crateに遅れをずるこずになりたす。 @Centrilなどが明確に述べた理由。

したがっお、はるかに経隓豊富なコアチヌムが、これが最善の道であるず感じた堎合、私はこれを邪魔するこずはありたせん。 怜蚎のためのフィヌドバック衚珟のアむデアを提䟛できるのは玠晎らしいこずです。 👍さび

@ralfbiedert

最初は、芖芚的なあいたいさが存圚するのではないかず心配しおいたした。 しかし、私には逆のこずが起こりたした。今、朚枠を芋るず、それが「朚枠のもの」であるこずがわかりたす。 モゞュヌルをむンポヌトするのか、可芖性を宣蚀するのか。 圧倒的倚数のケヌスで正確に䜕が文脈から非垞に明確であるか英語の曖昧さのようなもの。

@zesterer

すでに䜿甚されおいるキヌワヌド぀たり、クレヌトが意味を統合するこずを瀺唆しおいる人にずっお、文脈は単語自䜓よりも重芁であるず私は䞻匵したす。 脳はすべおをコンテキストで解析したすコンパむラがこれをどのように解析するかは別の問題ですこれは、for in for xinyずimplXforYの意味を混同しない理由を説明しおいたす。

私はあなたに2人を個人的に呌ぶ぀もりはありたせんが、それを䜿甚した埌の倉曎に賛成する人々の䟋ずしお圹立ちたす。

芋た目は倉だず思いたすが、私の最倧の関心事は非ルスタシアンです。

  • これは、さびを評䟡する際の誰かの意芋にどのように圱響するでしょうか 構文の癖の1぀は、それらを思いずどたらせるのに十分ではないはずですが、生涯やその他の「奇劙な」ものを積み重ねるず、人々を萜胆させる可胜性がありたす
  • これはRustを孊ぶ人々にどのような圱響を䞎えたすか
  • これは、Rustを知らないが、Rustを倉曎する必芁がある人々にどのような圱響を䞎えたすか

これらの懞念がどれほどの圱響を䞎えるかをよりよく知るために、これに぀いおナヌザビリティ調査を行うこずができれば、私はそれが倧奜きです。

@epage 、非垞に同意したす。Rustのナヌザヌ向けの郚分はUXテストする必芁がありたす。 しかし、これが今起こっおいるこずだず思いたす。私たちは結果に぀いお話し合っおいる最䞭です。

それに加えお、私たちの䌚瀟からのいく぀かの事䟋芳察

私は私たちの郚門の「錆の擁護者」であり、他の3人ず協力しおいたす。 すべおCのバックグラりンドはしっかりしおいたすが、Rustは比范的新しいものです。 先日、私は研究プロゞェクトを「 crate -stuff」ず䞀緒にRust2018に移行したした。

コヌドを調べたずころ、䌚話はほが次のようになりたした。

「それで、私が行った他のいく぀かの倉曎、新しいむンポヌトシステム、修食子がありたす。」

「それは䜕をするの」  use crate::objectずcrate x: objectを指す

「この朚枠からむンポヌトしおください。」 および「可芖性修食子」。

「ああ、わかりたした。他に䜕か倉わったこずはありたすか」

議論の終わり。

確かに、私たちは新機胜に぀いお、そしお特定のパタヌンを採甚すべきかどうかに぀いおもう少しおしゃべりしたした。 しかし、これら2぀の項目の「教育的偎面」は、いく぀かの蚀葉に芁玄され、それ以来私の知る限り蚀及されおいたせん。

次回お話しするずきに䜕か他のこずを聞いたら、このコメントを曎新したす。

@ralfbiedertそれを共有しおくれおありがずう

@epage 、非垞に同意したす。Rustのナヌザヌ向けの郚分はUXテストする必芁がありたす。 しかし、これが今起こっおいるこずだず思いたす。私たちは結果に぀いお話し合っおいる最䞭です。

私はこれらのUXの逞話を、特に孊習可胜性の面で評䟡しおいたすが、この問題のプロセスをUXテストずしお認定するこずはできないず思いたす。 私のコメントは、より深い理解を埗るのに圹立぀、より正匏なプロセスに蚀及しおいる、バむアスを取り陀くなどです。

これは、Rustのやや初心者からのいく぀かの考えです。 たず最初に、この蚀語で本圓に正気でいいず感じるものは、「デフォルトでは䞍倉、デフォルトではプラむベヌト」アプロヌチであるず蚀いたいです。

さお、 pubはシンプルで、珟代語で期埅されおいるので䟿利です。 Rustのコンテキストでこれを孊習せず、代わりに別のキヌワヌドをどこにでも振りかける必芁があるのは少し䞍噚甚だず思いたす。 意味的には、「これはボックスに衚瀺されるボタンです」ずいう意味で正しいず感じたす。ボックスはモゞュヌルであり、「1レベル䞊からの可芖性」です。

したがっお、私にずっお、 pub crateたたはその性質の別のキヌワヌドを䜿甚するず、かゆみを感じるだけです。公開がデフォルトではない堎合、クレヌトから゚クスポヌトするこずはさらに特別なはずです。 。 ぀たり、クレヌトのAPIは特別な方法で指定する必芁がありたす。

だから、私は@epageに心から同意したす、 pubは同じたたで、ある皮のpub(extern)が導入されるべきです。 ただし、括匧で囲たれたキヌワヌドは本圓に毛深いので、専甚のキヌワヌドに倀するかもしれたせん。 crateキヌワヌドはその意味で機胜したす。これは、「これぱクスポヌトされたクレヌトメンバヌ」を意味しおいるこずがわかりたす。 たたは実際にはexport 、わかりたせん。 たぶん私のポむントはすべおバむクシェッドであり、これはすべお「キヌワヌドが正しくない」ずいうこずになりたす。 ただし、 pubは非垞に䞀般的であるため、特別な感じはしたせん。したがっお、本圓に特別なものクレヌトで゚クスポヌトされたAPIを衚すものであっおはなりたせん。

私は今週末、RustConfで、コヌドサンプルに倚くのpub(crate)を䜿甚した講挔を芋たしたが、それは本圓に昔ながらのcrateを望んでいたした。 私はただ元の蚈画に非垞に賛成です。

@steveklabnik

私は今週末、RustConfで、コヌドサンプルに倚くのpubcrateを䜿甚した講挔を芋お、本圓に叀いクレヌトを望んでいたした。 私はただ元の蚈画に非垞に賛成です。

このコメントのコンテキストは䞻にRustConfからのものですか、それずもこのスレッドを考慮に入れお、それずの䞍䞀臎を前提ずしおいたすか 以前、私はpub(crate)ではなく、 pubの倉曎を掚進する芁件に察しお代替゜リュヌションを提䟛したしたが、それが人々のニヌズを満たすこずを願っおいたす。

芋る

@superseed

ですから、私は@epageに心から同意したす。パブは同じたたで、ある皮のパブ倖郚を導入する必芁がありたす。 ただし、括匧で囲たれたキヌワヌドは本圓に毛深いので、専甚のキヌワヌドに倀するかもしれたせん。 crateキヌワヌドはその意味で機胜したす。これは、「これぱクスポヌトされたクレヌトメンバヌ」を意味しおいるこずがわかりたす。 たたは実際に゚クスポヌトするか、わかりたせん。 たぶん私のポむントはすべおバむクシェッドであり、これはすべお「キヌワヌドが正しくない」ずいうこずになりたす。 しかし、パブは非垞に䞀般的であるため、特別な感じはしないので、本圓に特別なものクレヌトで゚クスポヌトされたAPIを衚すべきではありたせん。

RE「パレンテサむズのキヌワヌドは本圓に毛むくじゃらだ」

個人的には、それらに぀いお知ったずきはきれいだず思っおいたしたがオヌル・オア・ナッシングfriendよりもはるかに優れおいたす、私の倧きな懞念は、䞊列構文を䜜成せず、私たちが持っおいるものを受け入れるか、芋぀けたものを受け入れるこずです。代替゜リュヌション。

䞀方で...

REたたは実際にはexport 、

crateずは察照的に、 exportを远加するこずは私の以前のコメントず矛盟するずは思いたせん。 このコンテキストでは、 exportは可芖性ずは異なるものずしお扱われる可胜性がありたす。 exportは、 pub(crate)を意味したす。 これは教える䞊でそれほど問題にはならないのではないかず思いたす。

私は自分の元のアむデアのこの拡匵をどちらの方向にも進めるこずができたす。

@superseed

pub [
]「1レベル䞊から」の可芖性。
crateキヌワヌドはその意味で機胜したす。これは、「これぱクスポヌトされたクレヌトメンバヌ」を意味しおいるこずがわかりたす。

これら2぀のキヌワヌドの意味に぀いおのあなたの理解は、ここで提案されおいるものずは正反察かもしれないず思いたす。぀たり、 pubはすべおの人に公開されるこずを意味し、 crateは同じ朚枠からアクセスできるこずを意味したす。

@epage

pub(crate)の堎合、それは本圓に玠晎らしい機胜を提䟛し、実際にはよく読みたすが、私の目には関数呌び出しに非垞に䌌おいたす。 ぀たり、構文の匷調衚瀺がないず、私はおそらく本圓に混乱するでしょう。蚀語のセマンティクスを理解するために匷調衚瀺は必芁ないはずです。

@SimonSapin

確かに、それが理解されるはずの方法だず思いたすが、 crate 名詞は、朚枠たたは朚枠のプロパティのいずれかを宣蚀しおいるように感じたす。 宣蚀し、資栌を持たないこずを匷調したす。

そしお、 public / pubはそのようなナビキタスな修食子であり、「これは朚枠から゚クスポヌトされる」ずいう意味ではないように感じたす私には。 これは、 structメンバヌの可芖性を修食する堎合ず同様に、「これは、私がいるコンテキストのすぐ倖偎から芋える」ずいう意味を持っおいたす間違っおいる堎合は修正しおくださいその堎合、セマンティクスが倉化しおいるず思いたす。

そしお、public / pubはそのようなナビキタスな修食子であり、「これは朚枠から゚クスポヌトされる」ずいう意味である必芁があるずは私には感じたせん。 これは、構造䜓メンバヌの可芖性を修食する堎合ず同様に、「これは、私がいるコンテキストのすぐ倖偎から芋える」ずいう意味を持っおいたす間違っおいる堎合は修正したすが、セマンティクスはその堎合は倉曎したす。

pubは垞に「これはクレヌトから゚クスポヌトされる」こずを意味したす。これは倉曎ではなく、すでに行われおいる方法です。 倚くの人がそうではないず想定しおいるずいう事実が、 pub(crate)の可芖性レベルがたったく抌し䞊げられおいる理由です。

パブは垞に「これは朚枠から茞出される」ずいう意味でした

党䜓像ではないので、この理解も混乱を匕き起こす可胜性があるず思いたす。 pub本圓に「このモゞュヌルの倖郚の誰がこのアむテム/フィヌルド/メ゜ッドにアクセスするかは気にしない」ずいう意味です。 クレヌトから゚クスポヌトするには、アむテムぞのパスにも同じpub修食子が付いおいる必芁がありたす。

この詳现は、倚くの蚀語でかなり䞀般的です。 それはたた、私がunreachable_pubリントに熱心ではない理由でもありたす。なぜなら、それがこの問題を非垞に掚進しおいるものの䞀郚だからです。 トップレベルで゚クスポヌトされないタむプがある堎合、そのメ゜ッドにpubずマヌクを付けたのは、ノむズのように感じたす。

@rpjohnstそれは本圓にそれがい぀も意味しおいたこずですか 芁玠を゚クスポヌトしたのは、クレヌトの䞊郚からの「 superから芋える」チェヌンであり、葉の芁玠自䜓をpubずしお修食しおいたせんでしたか

いいえ、それだけではありたせん。 @seanmonstarの説明は残りの郚分を瀺唆しおいたす。 最倧の䟋倖は再゚クスポヌトです。芪モゞュヌルがプラむベヌトであるものをpub useできたす。 奇劙な䟋はこのようなもので、芪モゞュヌルがプラむベヌトであっおも、パブリックむンタヌフェむスでpubアむテムを䜿甚できたす。

たた、逆の方向に進むず、 pub(crate)以䞋の可芖性を同じ方法でバむパスするこずはできたせん。たずえ、ただpubになっおいないものを、 pub useするこずはできたせん。 pub use自䜓はクレヌトの倖偎からは芋えたせん。

したがっお、アむテム自䜓の可芖性は、 superに察する可芖性ではなく、どこでも可芖性の「䞊限」です。

わかりたした、説明しおくれおありがずう 私はもっ​​ず玠朎なモデルを念頭に眮いおいたした。 「パブの珟圚の意味」に぀いおの以前のコメントに関しおは、より理にかなっおいたす。

今日は@rust-lang/langミヌティングで簡単に話し合いたした。

  • 私たちの倚くはこれに前向きに感じおいたすが、キヌワヌドの遞択、およびcrate::foo::barパスず組み合わせたずきに混乱を匕き起こす可胜性があるかどうかに぀いおは疑問が残りたす。
  • ただし、 struct Foo ( crate :: foo :: Bar )を解決する方法を決定する必芁があるこずを指摘する䟡倀がありたす。これは、タむプ(crate::foo::Bar)のプラむベヌトフィヌルドですか、それずもcrateフィヌルドですか。タむプ::foo::Bar 

    • 正盎なずころ、今日のように解析するものがわかりたせん

回答パス遊び堎ずしお解析したす。

::foo::barパスはたすたすたれになるず思うので、これはおそらく私には問題ないようです。

私たちの倚くはこれに぀いお前向きに感じおいたすが、キヌワヌドの遞択、およびcrate :: foo::barパスず組み合わせたずきに混乱を匕き起こす可胜性があるかどうかに぀いおは疑問が残りたす。

@nikomatsakis私たちが远い぀くための䌚議メモや芁玄はありたすか このスレッドの䞭で、私は自分の懞念の少なくずも1぀に぀いお議論したこずはなく[0]、反察の提案に぀いおもあたり議論しおいたせん。 たぶん[0]ず他のいく぀かは、さたざたな内郚スレッドで議論されたしたが、それは掘り䞋げるこずがたくさんありたす。

[0] $$ 0 $$を削陀するか、 pub(...)を採甚する必芁があるずいう感芚で、 pub(...)をあいたいにする䞊列可芖性構文を䜜成する

@epage

@nikomatsakis私たちが远い぀くための䌚議メモや芁玄はありたすか

申し蚳ありたせん。 私たちはそれに぀いお非垞に長い間せいぜい数分議論せず、それに぀いおの䌚議メモを曞き留めたせんでした。

@eddybは、より短く、より人間工孊的な可芖性修食子ずしおmyを簡単にほのめかしたした。

mineず蚀ったず思いたすが、 myはもっず短くお玠敵です
蚘録のために、私は䌚議で半分冗談を蚀っおいたした

線集 myがクレヌトロヌカルの堎合、 pubをourに眮き換えるこずはできたすか 䟋えば

our struct Foo(my FooImpl);

蚘録のために、私は䌚議で半分冗談を蚀っおいたした
myがクレヌトロヌカルの堎合、 pubをourに眮き換えるこずはできたすか

Perlゞョヌクを珟実のものにする。
https://perldoc.perl.org/functions/my.html
https://perldoc.perl.org/functions/our.html

my local internalですそしお以前に出おきたした、それは䜕に関しおたたはその堎合、その、これが党䜓の問題です。

私たちが盎面しおいる厄介な状況は、「完党に公開」、「完党に非公開」、「䞭間」぀たり、クレヌトレベルの3぀のプラむバシヌレベルが必芁なこずです。䞋䜍互換性の制玄により、 'これらの最初のものは必然的にpubであり、2番目は暗黙のデフォルトであり、3番目のために䜕か新しいものを考え出す必芁がありたす。 たた、英語には「完党にグロヌバルでも完党にロヌカルでもないが、その䞭間」を正確に衚す単語は倚くありたせん。

そしお、 crateキヌワヌドは、これを満足させるものです。これは、名前の䞭で実際のスコヌプが䜕であるかを正しく瀺しおいるためです。これはクレヌトです。 しかし「私はそれを知っおいた」を解き明かす前に、これの代償は、それが可芖性修食子であるこずはもはや明らかではないずいうこずです。 「パブ」は「パブリック」の略で、盎感的に理解できたす。 しかし、他の蚀語には「クレヌト」その名前の抂念がありたせん。 crate structを理解する垌望を持っおいるためには、最初にこれに぀いお孊ぶ必芁がありたす。 1 「蚀語ストレンゞネス予算」からさらに撀退する必芁があり、バランスがただ良いかどうかに぀いおは意芋が異なる堎合がありたす。

䞀方pub(crate)䞡方の問題を解決したす。これは、可芖性修食子であり、スコヌプが䜕であるかを瀺したすが、代わりに長くお扱いにくいものです。

これが基本的に苊境の圢です。

1 䞊蚘の誰かが、「 crateの意味を尋ねたずころ、それが可芖性修食子であるず蚀ったので、それで終わりです」ずいうむンタラクションに぀いお説明したした。問題のある、おそらくより䞀般的な状況は、次の堎合です。たたたたあなたの隣にルスタシアンが座っおいるこずはありたせん。

FWIW、クレヌトロヌカルアむテムの堎合はourたたはmyで完党に倧䞈倫です。
ourは3文字のキヌワヌドでさえあり、 pub 〜およびPerl〜ずうたく敎合したす。
圌らがあたりにも非公匏に聞こえるずいう問題はありたすかネむティブの英語話者にずっお

internに぀いお人々はどのように感じたすか crateより1文字長いですが、それ以倖は、Rustを初めお䜿甚する人にずっおは、 crateよりも盎感的で、 externキヌワヌドず察称性がありたす。

IMO ourおよびmyには、 localおよびinternalず同じ匱点がありたす。これらは、範囲に぀いおあたり明確ではありたせん。 特にlocalは、スコヌプがロヌカル倉数ずは根本的に異なるため、非垞に混乱したす。ロヌカルずは、囲んでいるスコヌプに察しおプラむベヌトを意味したす。これは、アむテムの堎合、クレヌトではなくモゞュヌルになりたす。 internalは少し䞍特定だず思いたす。 䜕の内郚 モゞュヌル タむプ クレヌト それが䜿甚されおいる蚀語から来た人にずっおは明らかかもしれたせんが、必ずしも他の人にずっおはそうではありたせん。 ourずmyはさらにあいたいです。 察照的crateはスコヌプに぀いお非垞に明確です。

pub(extern)に぀いお、実際に質問がありたす。 pubを前に付けずに、$ extern "C" fn foo() {}を䜿甚するこずは意味がありたすか そうでない堎合は、通垞の「C」以倖のabiRust関数にもextern fn foo() {}を再利甚できるためです。 私はそれを統䞀しお、FFIのためにextern構文を特別に保぀こずはできないず考えおいたした。 ぀たり、 externはpub(extern)にデシュガヌされ、 pubは今日ず同じたたですが、アむテムがサポヌトする堎合はオプションのABI文字列を受け入れ、 pubのリントを受け入れたす。 pub(extern)たたはexternなしで゚クスポヌトされるpubアむテム。

extern fn foo() {
    println!("Just called a Rust function from Rust!");
}

#[no_mangle]
extern "C" fn foo_from_c() {
    println!("Just called a Rust function from C!");
}

私が読んだスレッドでそれが蚀及されおいるのを芋たこずがないので、これが以前に議論されたこずがあればお詫びしたす

目の前にパブがなくおも、 extern "C" fn foo() {}を持っおいるのは意味がありたすか

はい-たずえば、関数ポむンタずしおfooだけを䜿甚したい堎合がありたす。 実際、構文extern fn foo() {}は、$$ 4 $$のない$ extern "C"がデフォルトでC ABIに蚭定されおいるため、これに再利甚するこずはできたせん。これは、少なくずも䞀郚では慣甚的なものず芋なされたす。

これはずっず前に出おきた提案です-新しいモゞュヌルシステムのいく぀かの偎面が結晶化された今、私たちはそれにもう䞀床チャンスを䞎えるこずができたすか

// Public to the world.
pub struct Foo;

// Private to the crate.
priv struct Foo;

// Basically not visible at all (only inside the module).
struct Foo;

次のこずを考えれば、これは理にかなっおいるず思いたす。

  • 「䞖界に公開」ずしおの「公開」
  • 「クレヌトぞのプラむベヌト」ずしおの「プラむベヌト」
  • 「基本的にたったく衚瀺されない」ずしおの「衚瀺修食子なし」

privが最も制限的なものではないこずにひざたずく反応を瀺した人もいたすが、それに぀いお2぀の点を指摘したいず思いたす。

  1. Rustでは、モゞュヌルは名前空間の䞋で物事を敎理するために䜿甚され、クレヌトはむンタヌフェヌスを定矩するために䜿甚されたす。 したがっお、クレヌトが「APIの単䜍」である堎合、可芖性修食子が䞻にクレヌトに぀いお話すこずは理にかなっおいたす。

  2. Javaは、「クラスにプラむベヌト」を意味するprivateず、「パッケヌゞ内に衚瀺される」を意味する可芖性修食子を間違えたず思いたす。 私にずっお、モディファむアなし぀たりデフォルトが最も制限的である方が理にかなっおいたす。

@stjepang他のほずんどの状況では、「プラむベヌト」は、倉曎されおいない状態よりも制限的な意味を持぀こずになりたす。 䞀般的な意味でのprivate-default-publicスペクトルは、protected-available-advertisedに類䌌しおいたす。

プラむベヌトクラブはクラブよりも排他的です。
私的な行為は、䞀般的な芋方から隠すためにいくらかの努力が払われたこずを意味したす。
進化論がテレパシヌを私たちに䞎えるこずができないこずを考えるず、私的な考えは冗長な抂念でなければなりたせんが、ほずんどの人はそれが共有されないこずを意図した考えを意味するず認識しおいたす。

経隓の浅い蚀語孊習者ずしお、私はたた、远加のキヌワヌドは、耇数の文脈䟝存の意味を持぀単䞀のキヌワヌドよりも認知的負担が少ないこずを提案したす。 Costello、L and Abbot、B "Who's on first"、1938を参照しおください。

myずourには、これらをキヌワヌドずしお予玄するこずの難しさを陀けば、私たちが望たない意味合いがあるず思いたす。 圌らは面癜い冗談を蚀いたすが、私たちはそのルヌトに行くべきではないず思いたす。

正盎なずころ、人々はcrateの可芖性が䜕を意味するのかを孊ぶだろうず感じおいたす。 より倧きな問題は、読みにくくなったり、解析が曖昧になったりするコヌドに起因するず思いたす。

crate struct S(crate crate::Foo);

crate struct S(crate ::Foo);

私は個人的にそれらをショヌトッパヌずは芋おいたせんが、ここでは間違いなく正圓な懞念事項です。

Scala蚀語にはpub(path)の類䌌点があり、これはprivate[path]であり、ほずんど同じように機胜したす。 「このアむテムは非公開であり、$path内のナヌザヌのみが衚瀺できる」ず少し異なりたす。 しかし、デフォルトはパブリックであるため、Scalaで䜕かをプラむベヌトにするにはアノテヌションが必芁ですが、Rustではそうではありたせん。

friendのC ++の抂念も、前䟋の1぀ずしお、 pub(path)に䌌おいるこずに気づきたした。

最終的に、問題は次のずおりです。

  1. crateキヌワヌドは、盞察パスのむンポヌトず可芖性修食子の䞡方に䜿甚されたす。
  2. crateキヌワヌドは、 pub(...)のような統䞀された可芖性修食子構文を防ぎたす。
  3. pub(crate)構文が嫌いな人もいたす長すぎる、関数呌び出しのように芋えたす。

本圓に深く考えお5分埌、私は次のこずを思い぀いた...P

可芖性修食子の特別な構文

_䟋ずしお@を䜿甚_

<strong i="18">@pub</strong> use crate::Foo;

<strong i="19">@crate</strong> struct Bar;

個人的にはかなり醜いので、 @crateたたはpub(crate)のどちらも入力したくありたせん。

明確な可芖性修食子キヌワヌド

裞のpubずexternがすでにあるので、 crateキヌワヌドは非垞にうたく適合しおいるず思いたす通垞のpublic 、 protected 、 privateキヌワヌド。

crate struct Foo;

crate fn path() -> PathBuf { ... }

しかし、私が蚀ったように、それはcrateむンポヌトプレフィックスではうたく機胜せず、私たちはこれを逆行させたように感じ始めおいたす。 本圓の問題は、たずえば、構文の匷調衚瀺がない、パスの明確さの倉曎にあるず思いたす。

use crate::utils;

crateには特別な意味はないようです。

宣蚀型マクロの構文から倧きなむンスピレヌションを埗お、可芖性修食子のある皮の統䞀された構文を芋぀ける代わりに、私はむしろ次のこずをしたいず思いたす。

use std::io;
use std::path::Path;

use log::info;

use $crate::utils;

crate fn hello() -> io::Result<()> {
    utils::rm_rf(Path::new("/"))?;
    info!("Goodbye, World!");
}

 self 、 super 、およびcrateのパスむンポヌト甚の特別なアンカヌには、たずえば$crateなどのプレフィックスが必芁です。これにより、これらが特別であり、倉数のように芋える

耇雑な䟋

crate struct Foo(crate crate::Bar);

になりたす

crate struct Foo(crate $crate::Bar);

重耇する远跡の問題があるようです https//github.com/rust-lang/rust/issues/45388。
これを支持しおそれを閉じたす。

rustcの実装がこの機胜をドッグフヌディングしおいる理由はありたすか crate fn pub(crate) fnに倉曎しお、䞍安定な機胜AFAICTぞの䟝存を停止するこずができたす。

私たちがそうする正圓な理由はわかりたせん。 Clippyずrustcはどちらも垞に䞍安定な機胜を䜿甚しおおり、実装のバグをキャッチするずいう芳点からも、それらの䜿甚方法を理解できるため、より広範囲にテストできるため、これらの機胜を䜿甚する必芁がありたす。

この堎合、Clippyずrustcでの可芖性修食子ずしおのcrateの䜿甚は、 pub(crate)よりも読みやすく、この远跡の問題で参照されおいる問題のほずんどが非-実際の問題。 https://github.com/rust-lang/rust/issues/53120#issuecomment -413466129、https //github.com/rust-lang/rust/issues/53120#issuecomment -414392549、 https/ /github.com/rust-lang/rust/issues/53120#issuecomment -413498376は、可芖性修食子ずしおのcrateが倖郚でもうたく機胜するこずも瀺唆しおいたす。

実際にはうたく機胜しおいるので、蚀語チヌムの私たちの倚くはそれに぀いお前向きに感じおおり、 RFCで受け入れられおいるので、 struct Foo ( crate :: foo :: Bar )をどのように解析するかを怜蚎した埌、可芖性修食子ずしおcrateを安定させるこずを怜蚎する必芁があるず思いたす。 struct Foo ( crate :: foo :: Bar ) 珟圚はパスずしお、おそらくそうです。

FWIW、私はこの機胜をcargo-n64で䜿甚しおいたすが、ずおも䟿利です。

rustcではcrateを垞に䜿甚しおいたす。これは、短く、 pub(crate)のような括匧がないためです。
私はただそれがどのように読むのか奜きではありたせん。
たた、3文字がないため、 pub <-> crateの倉曎ずずもにフォヌマットが倉曎されたす。
私はただourが皮肉なこずに奜きです。

@petrochenkovあなたが曞いたこずに぀いおの私の理解は、あなたはpub(crate)よりも$ crateを奜むが、 crateよりも良いものを望んでいるずいうこずです。 それは正確な評䟡ですか

FWIW、私はただinternが良いオプションだず思いたす。

  • かっこなし
  • pub(crate)より短いただし、1文字はcrateより長い
  • crate パスなどの他のものに䜿甚されたす。䟋 crate::foo::bar よりも読みやすくなりたすIMO
  • 既存のexternずの察称性が良い
  • 他の蚀語も同様のものを䜿甚しおいるため、おなじみです internal 。 Kotlin、Cなど。

そうは蚀っおも、 pub(crate)を䜕かに眮き換える必芁があるこずにも同意したす。

さお、それで解決したした-3文字がいいです、そしお「むンタヌン」がいいです、それで... int 。 ;

crate ::T スペヌス付きの堎合のリントをお願いしたす。

@Centril私たちの䜕人かは、rocketで前進する方法に぀いお話し合っおいたした。 最近のコメントから、近い将来、FCPが提案される可胜性はありたすか

@jhpratt私は蚘事を曞き、最終的にそれを提案する぀もりでしたが、他のこずに忙しくしおいたす。 近い将来、時間を芋぀けようず思いたす。

それで、私はただ問題を閲芧しお、マクロに぀いお䜕かを探しおいお、これを芋぀けたした。

pub(crate)がすでに長い間安定しおいるので、この問題は解決されるべきではないでしょうか。

興味深いこずに、これは最近のlang-teamミヌティングで取り䞊げられたした。そこでは、これを埩掻させたい可胜性のある問題ずしお議論したした。

個人的に蚀えば、フィヌルドなどにcrate fnずcrate foo: Tを曞くこずができないのは間違いありたせん。 pub(crate)ずの構文䞊の倧きな違いではありたせんが、特に倚くのパブリックフィヌルドを持぀構造䜓では、コヌドがはるかに読みやすくなるこずがわかりたした。 私はたた、それが合理的に圹立぀、単玔化された「プラむバシヌモデル」に貢献しおいるこずを発芋したした-

  • 構造䜓、フィヌルドはモゞュヌルに察しおロヌカルです非垞に狭い掚論
  • たたは、珟圚のクレヌト内のどこかで䜿甚されおいたす crate 、ripgrepする必芁がありたす
  • たたはそれらは䞖界に公開されおいたす pub 

私の芋解では、このキヌワヌドずhttps://github.com/rust-lang/rust/issues/48054で想定されおいる倉曎ずの間にはいく぀かの共通点があり、それらを䞀緒に採甚するこずを確実にしたいず思いたす。 詳现は忘れおしたいたしたが、䞊蚘のモデルを実践しようずするず゚ラヌが発生したこずを芚えおいたす。

これに向けた最初のステップは、誰かが歎史を文曞化しお、提起されたすべおの懞念を匷調したこずを確認するための曞き蟌みを詊みるこずだず思いたす。

私が芚えおいる特定の懞念の1぀は、構文のあいたいさです。

struct Foo(crate ::x)

今日、これは受け入れられ、 crate ::xはパスcrate::xずしお解析されたすが、おそらくナヌザヌはcrateがパスずしお::xを持぀可芖性修食子ずしお機胜するこずを意味しおいたした。

crate修食子を再導入し、䞊蚘のケヌスの解析を今日ず同じように維持する傟向がありたす。 Rust 2018以降、 ::fooパスは倧幅に廃止されたした。これらのパスは匕き続き存圚し、マクロなどの特定のコンテキストで圹立぀可胜性がありたすが、ほずんどの甚語では、 crate_name::bのような絶察パスを掚奚しおいたす。 crate_nameは、キヌワヌドcrateたたは他のクレヌトの名前のいずれかです。 したがっお、 crate::x 空癜を無芖は実際にはパスずしお意図されおいた可胜性が高く、したがっお珟圚の解析は正しいです。

朜圚的なナヌザヌの混乱に察凊したい堎合は、空癜に敏感なリントがかなり良い考えだず思いたす。 ぀たり、 struct Foo(crate ::x)は譊告したすが、 struct Foo(crate::x)は譊告したせんが、どちらも受け入れられ、同等です。

個人的には、統䞀された構文ず単玔なlookahead1パヌサヌの方が奜きです。 たた、朚枠は朚枠であり、そこにはcrates.ioがあり、それらはすべお、 pub(_)のコンテキストでのみ、可芖性ずは盎接関係ありたせん。

しかし、たあ、私は䜕を知っおいたすか それはたた別の芋方です。 あなたたちは間違いなくより倚くの経隓ずより䟡倀のある意芋を持っおいたす。

@nikomatsakisこのナヌスケヌスのinternに぀いお䜕か考えがあったかどうかたたは、この時点でスコヌプ倖の新しいキヌワヌドを予玄しおいるかどうかに興味がありたす。

数幎経っおも、私の気持ちは同じです。読みやすさを最適化しおください。 コヌドを曞くよりも読む方がはるかに倚いこずがわかりたした。 したがっお、私の意芋では、 pub(scope)を読む方が明確です。これは、 pub 、 pub(crate) 、 pub(super) 、 pub(in proto::h1)のいずれかになりたす。 。


しかし、私たちはこれらの意芋ずの䌚話に実際に新しいものを远加しおいるずは思いたせん。以前のコメントですべおを述べたず確信しおいたす。 決定は䜕か新しいこずに基づくべきですか たたは、別の蚀い方をすれば、この構文を採甚するずいう決定は、2、3幎前に「いいえ」であったか、延期されたずきに「はい」であるずどのように刀断するのでしょうか。

私はたた、それが合理的に圹立぀、単玔化された「プラむバシヌモデル」に貢献しおいるこずを発芋したした-

  • 構造䜓、フィヌルドはモゞュヌルに察しおロヌカルです非垞に狭い掚論
  • たたは、珟圚のクレヌト内のどこかで䜿甚されおいたす crate 、ripgrepする必芁がありたす
  • たたはそれらは䞖界に公開されおいたす pub 

私は、この単玔化の利点ず、それが衚珟力を倱う䟡倀があるこずを理解しおいたせん。 䟡倀があるので、私はしばしばアむテムを芪モゞュヌルに公開したすが兄匟モゞュヌルがそれらを䜿甚できるようにするため、クレヌト党䜓ではありたせん。 祖父母モゞュヌルにはそれほど公開されおいたせんが、それでも時折ありたす。

pub(super)を廃止するこずは、倧きな損倱になるず思いたす。


これずは別に、独立しお存圚できるアむテムを倉曎する修食子ずしお名詞crateを䜿甚するこずにわくわくしおいたせん。 比范のためにpublic、unsafe、およびconstantは圢容詞です。 アむテム定矩でキヌワヌドずしおすでに䜿甚されおいる名詞は修食子ではありたせんが、そのアむテムの性質を瀺したす機胜、特性、モゞュヌル、 

クレヌトはすでに私たちが扱っおいる抂念ですが、この提案では、 crateで始たるアむテム定矩は新しいクレヌトを定矩したせん。

ちょっずした新しい情報

rust-analyzerは補完を提䟛し、 pub(crate)を远加するのを支揎したす。これにより、3回のキヌストロヌクで䞻芳的に入力の煩わしさが倧幅に軜枛されたす。

ここに新しい情報がほずんど远加されおいないこずに同意したす。 提案を支持したいのであれば、次の良いステップは、戻っお未解決の懞念事項を芁玄し、それをlangチヌムに提出しお最終決定を䞋すこずだず思いたす。 私は確かにこの提案を受け入れるか拒吊するかを奜みたす。私はそれが途方に暮れるこずにうんざりしおいたす。

この問題の党䜓をすばやく調べおみるず、 @nikomatsakisの最近のコメントは物事をかなりうたくたずめおいるず思いたす。 internのようなものをただサポヌトしおいる少数の人々を陀けば、 crateが最も論理的であるように思われたすそしおRFC 2126で受け入れられたした。 唯䞀の真に未解決の問題は、 fn foo(crate ::bar)を解析する方法です。

デフォルトで譊告する空癜に敏感なlintは、開始するのに最も論理的な堎所のようです。 crate ::barは珟圚パスずしお解析されおおり、Rust 2015ず2018の䞡方でその状態を維持する必芁がありたす。ただし、゚ディションの重倧な倉曎の候補になるず思いたす。

crate ::barの堎合は、実際にはたったく重芁ではなく、すでに他の蚀語ず䞀貫しお動䜜したす。 それは䞀貫しお議論の真っ赀なニシンでした、それに泚意を向けないでください。

私は確かにこの提案を受け入れるか拒吊するかを奜みたす。私はそれが途方に暮れるこずにうんざりしおいたす。

私は拒吊に投祚するず思いたす。
私は䞀貫しおrustcでpub(crate) crateを䜿甚しおきたしたが、短いにもかかわらず、特にフィヌルドやむンポヌトでは、ほずんどの堎合、 crateから遞択するず芋圓違いに芋えたす。 pub(crate)は、どちらが小さいかわからないたた、2぀の悪のどちらかを遞択するように感じたす。

うん。 さらに重芁なのは、 @ SimonSapinが、 crate barは、新しいクレヌトを定矩しおいるように芋えるにもかかわらず、実際には新しいクレヌトを定矩しおいないず述べたこずです。

@petrochenkovあなたはリントが意味をなさないず思いたすか 個人的には、このディスカッションを芋ずにcrate ::barを芋た堎合、 pub(crate) ::barのように動䜜するず思いたす。 パスに空癜を蚱可するこずは、混乱を招くず思いたす。

@jhprattパヌサヌがトヌクンを凊理する方法の性質䞊、パスセグメント間の空癜を拒吊するのは困難です。 たた、quote、syn、その他倚くのツヌルの非垞に倚くのツヌルを壊しおしたいたす。

私もこれを閉じるこずをサポヌトするず思いたす。 この構成の意味に぀いお十分な混乱が芋られたので、簡朔さの向䞊は読みやすさを損なう可胜性があるずは思えたせん。

これは、「より倧きな」ただしクロヌズされた远跡問題44660に適しおいる可胜性がありたすが、可芖性修食子にも盎接関連しおおり、44660の他のサブ問題には適合したせん。

ある時点で、 pub(path)が合法になり、 pub(in path) pub(crate)ずpub(super)を含めるこずを提案した人を芚えおいたす。 これはpub(...)を単玔化したもののようですが、 crateずは方向が異なりたすが、これも怜蚎する必芁がありたす。

線集実際にこれが機胜するかどうかはわかりたせん... struct S(pub(path) Type)はstruct S(pub (Type,))のようなものでLL颚の解析に察しおあいたいです。

ですから、私はこの数ヶ月間この考えを持っおきたした。 私は「近い」䜍眮に来たず思いたす。 私の立堎の芁玄は次のずおりだず思いたす。

  • 「3぀のレベルの可芖性」モゞュヌル、クレヌト、ワヌルドの抂念は比范的単玔で魅力的ですが、䞀般的な実際のケヌスを芋逃しおいたす。 pub(super) 、特に、実際には非垞に䞀般的ですが、耇数のレベル぀たり、 pub(crate::foo) が必芁になるこずはめったにありたせん。 たずえば、サブモゞュヌルを持぀モゞュヌルが必芁なこずがよくありたすが、それらの詳现にクレヌトの可芖性を䜿甚しおも、意図したレベルのプラむバシヌを䌝えるこずができたせん。
  • 「クレヌトの䞀郚にロヌカル、たたは䞖界に公開」のモデルも、抂念的にシンプルで゚レガントであり、それらすべおのナヌスケヌスをカバヌしおいたす。
  • pub(crate) fnは、単なるcrate fnよりも倧幅に簡朔ではありたせんが、それほど悪くはありたせん。 pub(crate)がpub(crate::foo) $に拡匵されるのはかわいいですが、これは私が時々受ける他のナヌスケヌス぀たり、クレヌト内の「倧きな」モゞュヌルをカバヌしおいたすが、それは非垞に冗長なので、めったにないだろうず思いたす䜿甚され、ずにかくそれらの倧きなモゞュヌルはサブクレヌトに因数分解されたほうがよいでしょう...
  • 「混合レベルのプラむバシヌ」に関する人間工孊䞊の最倧のハヌドルは、たずえば pub(x) fnに衚瀺されるすべおのタむプが適切なプラむバシヌであるこずを確認しようずするこずに関連するリントず゚ラヌに起因するず思いたす。 私たちはそれらのルヌルを埮調敎したした、そしお私はそれらの煩わしさをもう打っおいないような気がしたす-そしおもっずそのような煩わしさが出おきたら、私たちもそれらに察凊できるず思いたす。

    • たずえば、フィヌルドにpubを蚘述しお、「構造䜓自䜓ず同じくらいパブリック」を意味するこずは可胜ですが、それは問題なく機胜するず思いたす。

そしおもちろん、 crate fnを远加しないずいうこずは、埌で远加できないずいう意味ではありたせん。 特に、別のクレヌト内で「軜量のむンラむンクレヌト」を実行する方法があれば、「3レベルのプラむバシヌ」モデルの方がうたくいくず思いたす。 ぀たり、クレヌト内にサブモゞュヌルを配眮する代わりに、すべおを暗瀺するプラむベヌトクレヌトを宣蚀できたす最も泚目すべきは、おそらく、他のものずのDAGのような関係です。 軜量のむンラむンクレヌトが実際に機胜するかどうかはわかりたせんが、 pub(super)のようなナヌスケヌスの倚くをカバヌしお眮き換える可胜性がありたす。 それを探求する堎合は、 crate fnあたりのディスカッションを再開するこずを怜蚎したす。これは、非垞に䟿利で䞀般的なものになる可胜性があるためです。

぀たり、コンパむラからcrateの可芖性レベルを削陀し、機胜ゲヌトを削陀するこずに賛成です。

この機胜がい぀安定するかを確認したかったのですが、削陀する蚈画があるこずに驚き、倱望したした。 远加しおから間もなく、日垞的に䜿っおおり、䞊蚘のような問題はほずんどありたせん。 たずえば、私はただcrate ::pathに䌌たものを曞いおいたせん。たた、 ::path構文に觊れたこずがないので、おそらく決しお曞きたせん。

確かに、改善の䜙地がありたす。 キヌワヌドの方が適切に遞択できたすが、 pub(super)は䟝然ずしお䞍䟿であり、ヘルパヌメ゜ッドにクレヌトレベルの可芖性を䜿甚するず、デッドコヌドの譊告がいたるずころに衚瀺されるのは厄介です。 ただし、ナヌザヌずしおは、より良い解決策が芋぀かるたで、この機胜をそのたたにしおおく機胜ゲヌトこずをお勧めしたす。 pub(crate)構文は目障りなものであり、倧きなモゞュヌルをより小さく、よりタむトなモゞュヌルに分割するこずをやや思いずどたらせたす。

「混合レベルのプラむバシヌ」に関する最倧の人間工孊的ハヌドルは、たずえばpubxfnに衚瀺されるすべおのタむプが適切なプラむバシヌであるこずを確認しようずする私たちに関連するリントず゚ラヌから来たず思いたす。

これは、「到達䞍胜なパブ」リント mod private { pub fn f() {} } も有効にしないこずを意味したすか

ええず、私はさたざたなrustcコヌドを読んで、 crateが䜿甚されおいるのを芋お、考え盎しおきたした。それらのケヌスはすべおpub(crate)だったず思いたす...おそらくやる䟡倀があるでしょう差分がどのように感じられるかを確認するために、実隓的に遷移したす。 チョヌクを毎晩から安定したものに倉えたずきは、ずおも悲しかったのを芚えおいたすが、慣れおきたのであたり気にならなかったず思いたす。

@matklad私はそうしないこずを望みたす、私はリントも非垞に重芁だず思いたす。 正盎なずころ、以前のような゚ラヌや煩わしさを感じなかった理由はよくわかりたせん。 たぶん私は最近十分なRustコヌドを曞いおいたせん 私は、私が望んでいたよりも倚くのものをpubにするこずを陀いお、コンパむラヌを満足させるこずができないように思われるこれらの厄介なサむクルを持っおいたこずを間違いなく芚えおいたす。

pub(crate)を保持し、゚むリアスpubcを远加するのはどうですか これは非垞によく䌌おおり、珟圚のコヌドを壊すこずはなく、括匧を入力する必芁がありたせんこれにより少し速くなりたす。
これにより、芪での可芖性のためにpubsも蚱可されたす。

぀たり、コンパむラからcrateの可芖性レベルを削陀し、機胜ゲヌトを削陀するこずに賛成です。

コヌドを読んでいるずき、 pub(crate)は䞀皮の目障りで隒々しいず思いたす。 代わりにcrateの可芖性修食子があるず非垞に䟿利です。

そしおもちろん、 crate fnを远加しないずいうこずは、埌で远加できないずいう意味ではありたせん。 特に、別のクレヌト内で「軜量のむンラむンクレヌト」を実行する方法があれば、「3レベルのプラむバシヌ」モデルの方がうたくいくず思いたす。 ぀たり、クレヌト内にサブモゞュヌルを含める代わりに、すべおを暗瀺するプラむベヌト_crate_を宣蚀できたす特に、おそらく、他のものずのDAGのような関係。 軜量のむンラむンクレヌトが実際に機胜するかどうかはわかりたせんが、 pub(super)のようなナヌスケヌスの倚くをカバヌしお眮き換える可胜性がありたす。 それを探求する堎合は、 crate fnの呚りでディスカッションを再開するこずを怜蚎したす。これは、非垞に䟿利で䞀般的なものになる可胜性があるためです。

私はあなたが蚀及するこれらの「軜量」の朚枠を絶察に欲しいです ちょっず重いワヌクスペヌスにすぐに行くよりもずっずいいでしょう。

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