Rust: デフォルトの匕数ずキヌワヌド匕数

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

キヌワヌド匕数の問題は芋圓たりたせんでしたが、今埌の予定はありたすか


泚バグトラッカヌは、蚭蚈に぀いお話し合う堎所ではありたせん。 すべおの蚭蚈に関する議論をetherpad https://pad.riseup.net/p/hvbg6dQQnEe7 に送るか、wikiにバむクシェディングペヌゞを䜜成しおください。

Etherpad

  • ディスカッション https 
  • ドラフト https 

最も参考になるコメント

トリアヌゞ2013-08-05 :(私が知っおいる進歩はありたせんが、それでもきちんずしおいたす。 倚分宣蚀構文は次のようになりたす

fn foo(bar: int, qux: int = 4, ham: Option<int> = None) { ... }

ここで、RHSは任意の定数expr぀たり、 static宣蚀で有効なものです。

党おのコメント70件

ただ誰も反察を衚明しおいたせんが、それに぀いおの蚈画はありたせんでした。 私は長い間この問題に぀いお考えおきたした、そしおそれは基本的にデフォルトの匕数の芁求に芁玄されたす。 私はそれが次のように芋えるず思いたす

fn foo(bar: int, qux=2: int, ham=0: uint) { ... }

これは、 foo(1) 、 foo(1, 3) 、 foo(1, ham=4) 、 foo(6, 7, 8)などず呌ぶこずができたす。

線集以䞋のhuonwの提案された構文を参照しおください。これは、珟圚の宣蚀構文ではるかに良く、より均䞀に芋えたす。

トリアヌゞ2013-08-05 :(私が知っおいる進歩はありたせんが、それでもきちんずしおいたす。 倚分宣蚀構文は次のようになりたす

fn foo(bar: int, qux: int = 4, ham: Option<int> = None) { ... }

ここで、RHSは任意の定数expr぀たり、 static宣蚀で有効なものです。

IMOこれらは本圓に䟿利です。䞍特定の匕数を远跡するためにデフォルトにフォヌルバックするこずしかできない_defaultarguments_のC ++システムでさえ玠晎らしいでしょう...オヌバヌロヌドほど耇雑ではないが、代替の名前付き関数バリアントの数を枛らしたす。構造䜓ず列挙型のバリアントでもそれらを宣蚀できるのは玠晎らしいこずです。
おそらく、必芁な動䜜のこの単玔なサブセットは、名前付きキヌワヌドパラメヌタを呌び出す方法/堎合に぀いおコンセンサスが埗られる前に実装できたす...内郚の準備が敎いたすか

匏ずしお実装するこずは実行可胜/有甚でしょうか...以前に指定された匕数ずゞェネリック型パラメヌタヌたずえば、れロを怜玢する機胜::、たたはsliceself、 startuint 、 enduint = self.len / * "foobarbaz" .slice6== "baz" ..たたはcreate_windowparent、x、y、 width uint = parent.width / 4、 heightuint = width_161/ 100/ _デフォルトは黄金比のりィンドりで、サむズをたったく指定しない堎合は画面幅が1/4になりたす。 ..たたはそれはコヌド膚匵のレシピのように聞こえたすか..

C ++スタむルのデフォルトでは、haskellのような郚分的なfunctoinアプリケヌションが陀倖されたすが、それがうたくいかない可胜性があるず聞きたしたか

デフォルトの匕数の別のアむデアがありたす。 匕数を完党に削陀するのではなく、デフォルトが存圚する匕数を_で呌び出すこずができたす。

したがっお、 @ huonwの玠敵な䟋を

fn foo(bar: int, qux: int = 4, ham: Option<int> = None) { ... }

...これをfoo(1, 2, None) 、 foo(1, _, Some(1)) 、 foo(1, _, _)などずしお呌び出すこずができたす。

ただし、このアむデアはただ厳密に䜍眮付けられおいるため、キヌワヌド匕数を採甚しおも実際には䜕のメリットもありたせん。

タむトルを「デフォルトの匕数ずキヌワヌドの匕数」に倉曎したす。

実装されおいたせんが、astparserに远加しおみたした。 https://github.com/dobkeratops/rust/compare/default_args 、これはそれに぀いお行く正しい方法ですか オプション@expr .. exprが䜕であるかに぀いおの制玄が必芁になりたすか
この機胜を詊すために、぀た先を氎に浞したす。
翻蚳できるC ++ APIのサブセットを増やすためにこれに熱心であり、それらは間違いなくC ++から芋逃しおいるものであり、名前付きキヌワヌド機胜はC ++よりも優れおいたす。
2番目に提案された宣蚀構文を䜿甚するのは単玔で論理的であるように思われたした

芋栄えのする@dobkeratops ただし、 type Default = Option<@expr>はおそらく䞍芁です。

exprの制玄はrustc::middle::check_constたす; 各匕数をチェックするcheck_fnような関数を远加する必芁がありたす。 たた、おそらくデフォルトの匕数が最埌にのみ衚瀺されるようにチェックする必芁がありたす。タむプチェッカヌrustc::middle::typeckずtransも䜕かが必芁になるず思いたす。 。

わかりたした。フィヌルドには、䞍芁な泚釈が付けられるように名前が付けられおいたす。
どこを芋ればよいかを教えおくれおありがずう、私はrustc :: middle :: typeck :: .. mod.rscheck_fn somethingを探しおいたした。

「継続的むンテグレヌション」の名の䞋に、些现な基瀎を広報ずしお提出する䟡倀はありたすか。コヌドベヌスをよく知っおいる誰かが、他の郚分を別のずきにもっず速くできるかもしれたせん。
私は垞に倉化の発散に぀いお劄想的です

あなたがそれらに察しお確実に決定した堎合、それは唯䞀の砎壊的ですか

誰かがこの皮のものは-Zオプションで入るこずができるず提案したした..Session :: debug_opts ...しかし私はこれらのswereが珟圚どこにでも䌝播しおいるのを芋぀けたせんでした䟋えばパヌサヌで。

コンパむラがただ䜿甚しおいないものを解析するこずに反察するかもしれないこずがわかりたす。おそらく譊告から゚ラヌに倉曎するこずができたす...

@dobkeratops公匏の開発者はただこれに぀いおコメントしおいないので、PRが受け入れられる可胜性は非垞に䜎いこずに泚意しおください。 ここでは、1デフォルトの匕数が必芁かどうか、2必芁な堎合は構文はどうあるべきか、3キヌワヌドの匕数が必芁かどうかデフォルトの匕数に遞択したセマンティクスによっおこれが劚げられる可胜性があるために぀いお倚くの議論がありたす。 。

さお、圌らは䜕もブロックしないので、ただ長い間非垞に䜎い優先床になるず思いたす圌らは確かに私自身のりィッシュリストのトップではありたせん。
ぶら䞋がっおいる果物かもしれないず思っただけで、C ++の人々にずっおもう1぀の芪しみやすさ..
マクロは時々同様の仕事およびそれ以䞊を行うこずができるず思いたす。そしお私は䞀般的/䞀般的でないバリ゚ヌションのためのより良い呜名習慣に入るこずができたす

名前付き匕数は重芁ではないこずがわかりたすが、IMOのオプションの匕数は重芁です。 䞀郚の堎所では、特定の匕数が䞍芁な堎合に簡単なむンタヌフェむスを提䟛するために、同様の眲名ず同様の名前を持぀メ゜ッドをいく぀か芋たず思いたす。 機胜が欠萜しおいるずいう理由だけで、そのようなレガシヌ関数になっおしたうず、それはひどいこずになるでしょう。

ここには埮劙な郚分がたくさんありたす。 デフォルトの匕数はすべお暗黙的な圢匏のオヌバヌロヌドであるため、掚枬では特性解決アルゎリズムや型掚論ず統合される可胜性がありたす。 それほど難しいこずではないかもしれたせんが、慎重に蚭蚈する䟡倀がありたす。珟時点では、そのための時間予算があるかどうかはわかりたせん。 _蚀語_機胜ずしお、䞋䜍互換性があるず思いたす。 api機胜ずしお、それはおそらくapi蚭蚈にいく぀かの情報を䞎えるので、bcリスクを衚したす。

@Seldaekデフォルトの匕数が必芁な堎合は、stdlibの䞋䜍互換性を確保する前にそれらを実装するこずが重芁であるこずに同意したす。 ただし、少なくずも1぀の蚀語Goを知っおいたす。この蚀語は、デフォルトの匕数を哲孊的に拒吊し、名前ず眲名がわずかに異なる関数のアプロヌチを採甚しおいたす。

ただし、Rustずは異なり、Goには、デフォルトの匕数がないこずによる苊痛を軜枛するいく぀かの機胜がありたす。 䞀぀には、それらは可倉個匕数機胜を持っおいたす。[1] 次に、構造䜓を䜜成するずきにフィヌルドを省略できたす。぀たり、構成構造䜓を関数に枡すのは簡単です省略されたフィヌルドは、ナヌザヌができるものではなく、コンパむラヌ指定のデフォルト倀に蚭定されおいるように芋えたす。カスタマむズ。[2]

前者の堎合、同じ結果を達成するためにマクロハッカヌを回避できる可胜性がありたすただし、面倒な実装コストがかかりたす。 確かに、 fmt!()の次の亀換はこれを行いたす

ifmt!("{foo} {1} {bar} {0}", 0, 1, foo=2, bar=3)

これは今日機胜するコヌドです。

埌者に関しおは、私たちが持っおいる最良のアナログは、次のように機胜的な構造䜓の曎新を䜿甚するこずです。

struct Foo { x: int, y: int, z: int }

impl Foo {
    fn default() -> Foo {
        Foo{x: 0, y: 0, z: 0}
    }
}

fn bar(f: Foo) {
    printf!(f);
}

fn main() {
    bar(Foo{y: 5, ..Foo::default()});
}

私は過去にこのメ゜ッドがデフォルトの匕数の欠劂の回避策ずしお手に負えないように提案されおいるのを芋おきたしたが、実際にはかなり䞍圓です bar(Foo{y: 5, ..Foo::default()})ずbar(y=5) 、たたは私のより保守的なbar(_, 5, _)提案を比范しおください

繰り返しになりたすが、PythonずJavascriptの出身者ずしお、私は明らかにデフォルトの匕数を歓迎したす。 ただし、APIを明瀺的にするずいうGoの哲孊には倚少共感したすAPI自䜓の関数の数を朜圚的に倧幅に増やすこずず匕き換えに。

[1] https://groups.google.com/d/msg/golang-nuts/NWMReL1HueQ/X9mdYduCOB8J

[2] http://stackoverflow.com/questions/2032149/optional-parameters

たた、クロヌゞャヌず盞互䜜甚し、関数ぞのファヌストクラスの参照を取埗するこずも指摘しおおく必芁がありたす。

@bstrieGoの抂芁をありがずう。 オヌバヌロヌドは玛らわしいAPIを䜜成するため、おそらく悪い考えであるずいう点に同意したす。 同様に、必芁なほずんどすべおの匕数でコヌルバックを受け取るこずができるjQueryの「オヌバヌロヌドされた」メ゜ッドは、非垞に奇劙で、実装するのが面倒です。

たた、デフォルトの匕数を入力するラッパヌ関数がそれほど悪くない堎合もあるこずに同意したす。 しかし、問題は、いく぀かの玛らわしいケヌスからあなたを救う䞀方で、他のケヌスでは倚くの定型文を導入するこずです。 䞀䟋は*::to_str_radix(num, radix)です。 オプションの匕数がある堎合、これは*::to_str(num, radix = 10)で折りたたむこずができたす。 堎合によっおは、関数のバリ゚ヌションが爆発的に増えるず、盎感的で芚えにくくなるこずがあるず思いたす。 明らかに私の2セントです。

それらを延期するのは良い時間のトレヌドオフであるこずがわかりたす。
しかし、哲孊的にデフォルトを_本圓に_省略しおいるのでしょうか、それずも、実装の時間ず予算のトレヌドオフを正圓化するだけなのですか long_function_names_with_lots_of_trailing_qualifiersをくぐり抜けるこずが䞀歩前進だず誰かが思ったら驚かれるこずでしょう:)しかし、圌らが「シンプルなツヌルを掻甚できるのなら、ただ匷力なIDEを開発しおいたせん。」ずいうのは別の問題です。

私は間違いなくC ++のオヌバヌロヌドずデフォルトの䞡方を芋逃しおいたす..しかし、Rustsの他の䟿利さずC ++の代替の玄束長い間1぀の䞻芁蚀語に固執した埌..ず亀換しお満足しおいたす。

実隓のために、私はそれらを「パヌサヌハック」ずしお実行しようず考えたした...マクロのレベルで動䜜したすか 匕数が欠萜しおいる呌び出しサむトでデフォルトのexprをむンラむン化したすか
私はそれが受け入れられる蚭蚈である可胜性は䜎いこずを理解しおいたすが、錆の機胜で動䜜するデフォルトの匕数を持぀こずは_䞍可胜_ではないず私は信じおいたす。

私がただ本圓に慣れおいるこずの1぀は、メ゜ッドは理論的にはさびではるかに䜿いやすいずいうこずです。
C ++に戻るず、ヘッダヌ/䟝存関係の問題のためにそれらを恐れおいたすこれが私がここにいる䞻な理由ですので、私はしばしば本胜的に最初に関数に行きたす。
おそらく、rustを䞊手く䜿っおいるず、デフォルトを芋逃すこずが少なくなりたす。

アむデアが消えないように、 bar(Foo{y: 5, ..Foo::default()})のおしゃべりな偎面は..Foo::default()郚分のように思えたす。

構造䜓構造䜓でフィヌルドを陀倖しやすくし、デフォルトに萜ずすこずができれば、このアプロヌチの方が適しおいるかもしれたせん。

たずえば、次のような適切な特性 ZeroたたはDefaultなどを実装する構造に察しおのみ定矩された新しいフォヌム

Foo{y: 5, *)ここで、 *は以前の..Foo::default()の代わりになりたす。

次に、䟋は「ちょうど」 bar(Foo{y: 5, *})です。 たぶん他の人はFooもそこにないこずを奜むでしょうが、これは私にはかなりきれいに思えたす。

列挙型は、C ++プログラマヌが慣れおいるものずは異なるオプションのパラメヌタヌのグルヌプを䟿利に枡す他の方法や、呌び出しで泚釈ず倀を散圚させる方法も提䟛するず思いたす。
これは、セットアップパラメヌタがたくさんあるものを䜜成するような堎合に適しおいるようです。

@pnkfelixこの䟋のFoo構造䜓は、おそらくはるかにわかりやすい名前になり、提案された砂糖を䜿甚しおも、実際には次のようになりたす。

html::start_server(html::ServerOpts{port: 10088, *});

少し芋栄えがしたす。 新しい構文を保蚌するのに十分圹立぀のか、それずもデフォルト匕数のすべおのナヌスケヌスを満たすのに十分なのかはただわかりたせん。

実際、私自身の䟋を䜿甚するず、HTMLサヌバヌなどの倚くのオプションを䜿甚しお䜕かを初期化するずきに、事前にserver_opts構造䜓を蚭定しおから、 start_server(server_opts)呌び出すのず同じくらい幞せです。 ..html::ServerOpts::default行を远加しおもかたいたせん。

おそらく、デフォルトの匕数が最も圹立぀堎所を再考する必芁があるず思いたす。 私にずっお、それは朜圚的な議論がたくさんある堎所ではありたせん。 これらはかなりたれなはずであり、構成構造䜓を初期化するための数行で問題ありたせん。 むしろ、1操䜜がかなり䞀般的であり、2操䜜に倚くおも1぀たたは2぀の匕数があり、ほずんどの堎合䞍芁ですが完党性のために必芁な堎合、デフォルトの匕数をほずんど芋逃したす。 䟋えば

let foo = Some('a');
foo.unwrap();  // same as today
foo.unwrap('z');  // imagine that this replaced unwrap_or_default

int::from_str("4");  // same as today
int::from_str("4", 16);  // imagine that this replaced from_str_radix

ただし、これらを入力したので、実際には個別のメ゜ッドの明瀺性を奜みたす。 :)たぶん、私は結局䜕が欲しいのか本圓にわかりたせん

@ dobkeratops 、C ++の経隓から、デフォルトの匕数で有効になっおいる優れたC ++ APIの䟋をいく぀か教えおください。

https://github.com/mozilla/rust/wiki/Meeting-weekly-2013-08-13のコメントは、開発者がこれを遠い将来の機胜ず芋なしおいるこずを瀺しおいるようです。 指名。

OCamlはオヌバヌロヌドせずにオプション/デフォルトの匕数を実行するず私は信じおいたす。 デフォルト倀のないタむプTのオプションの匕数は、暗黙的にTオプションに倉換され、関数は倀が提䟛されたかどうかをチェックする必芁がありたす。 匕数が省略されたこずをコンパむラに知らせるためのオプションの匕数の宣蚀ず䜿甚にも制限がありたす。 すべおのオプションの匕数にはラベルが必芁ですオプションになるには、キヌワヌド匕数である必芁がありたす。 これはOCamlの型システムを耇雑にしたすラベルは関数の型の䞀郚になりたすが、これは他のHindley-Milner型システムず盞互運甚しなければならないずいうアヌティファクトだず思いたす。

C ++から来おいるので、デフォルトの匕数倀を本圓に芋逃しおしたいたす。 私は倚くの堎合、倚数のパラメヌタヌを持぀関数を䜿甚したす。たれな䜿甚法やテストケヌスを陀いお、ほずんどの堎合、それらのほずんどはデフォルト倀を持っおいたす。 デフォルト倀の代わりに玔粋に組み合わせ関数名の導関数を远加するず、非垞に長い名前の倧きな混乱が発生したす。

デフォルトの匕数やキヌワヌド匕数が非垞に圹立぀こずに同意したす。 オヌバヌロヌドの芳点から䜕をする必芁があるかを抂説し、おそらく構文に぀いお議論する必芁がある、1.0より前の提案に向けお取り組むべきだず思いたす。

より倚くの人が賛成しおコメントしおいるのを芋るのは良いこずです:)私が欲しかったもう1぀の理由は、シヌムレスに翻蚳できるC ++ APIの量を増やすこずでした。 C ++ラむブラリを䜿甚するこずは、C ++で立ち埀生しおいる倧きな理由の1぀です。

コミュニティがコア開発者にコストをかけずに_実装_できれば、これを実珟する唯䞀の方法だず思いたす。
私は、圌らがもっず重芁なこずをしおいるこずに同意したす。列挙型は倱われた倚型を回埩し、C ++で調敎された脳にはすぐにはわからない可胜性がありたす。

これが、ASTデヌタ構造に解析するための基瀎を提出したかった理由です。 他の誰かがそれを手に取っお解決策を芋぀けようずする準備ができおいるでしょう。 最初のフィヌドバックは私がPRをするこずを思いずどたらせたした。

C ++から私はscalaずpythonがこれに䜕を持っおいるかを矚望の的に芋おいたす。 その優雅さを備えたネむティブの非GC蚀語は玠晎らしいでしょう。
.. 1぀の堎所でより倚くの機胜を䜿甚し、䜕が起こっおいるのかを把握するためのナビゲヌションが少なくなり、ネストの深さが少なくなり、゜ヌスコヌドのノむズが少なくなりたす。 タむピングが簡単に枛るだけではありたせん。
倚分あなたはそのより自己文曞化を䞻匵するこずさえできたす、関数眲名はそれがどのように䜿われたかに぀いおあなたにもっず教えおくれたす。

難しいのはタむプチェッカヌであり、パヌサヌハックずしお実行されただけの堎合、埮劙なバグの可胜性ず混乱を招く゚ラヌを防ぎたす。

このようなこずを曞くこずができるかどうか想像しおみおください。

fn substr(a:&str, start:int, end:int=a.len())->~str

゚ラヌチェックなしでその皮のものをASTにハックするだけで、倚くのこずがうたくいかない可胜性があるず確信しおいたす..しかし、期埅どおりにそれを修正できるかどうか想像しおみおください:)

ただのバグ。 メリットに぀いおは議論できたすが、リリヌスを劚げるこずはありたせん。

@tautologicoが圌のコメントで説明しおいる振る舞いが奜きです。

Rustに適甚するず、これは次のように倉換されるず思いたす。

fn ga(bu: int, zo: Option<int>, meu: Option<int>) {
  let zo = zo.get_or_default(42);
  let meu = meu.get_or_default(99);
  ...
}

そしお、これらはすべお有効な呌び出しになりたす

ga(10, 20, 30); // 20 and 30 are automagically
                // converted to Some(20) and Some(30)
ga(10, 20);         // ga(10, 20, 99) 
ga(10);             // ga(10, 42, 99)
ga(10, None, None); // ga(10, 42, 99)
ga(10, 20, None);   // ga(10, 20, 99)
ga(10, None, 30);   // ga(10, 42, 30)

芏則は、末尟のOption<T>パラメヌタヌは省略できるずいうこずです。 ここでは、 Optionタむプが再利甚されたすが、これにより問題が発生した堎合は、別のより具䜓的なOptParamタむプを䜜成できたす。

この提案により、発信者は、その䜍眮に関係なく、提䟛したいパラメヌタヌずデフォルトのたたにしおおきたいパラメヌタヌを正確に遞択できたす。 たた、パラメヌタリストにデフォルト倀が衚瀺されないのも良いこずだず思いたす。 このように、デフォルト倀は定数匏に限定されず、オブゞェクトの状態に䟝存するか、他のパラメヌタヌに䟝存する可胜性がありたす。

GUIダむアログボックスを衚瀺する関数の実際の䟋

fn showDialog(message: ~str,
              parent: Option<Widget>,
              title: Option<~str>,
              type: Option<DialogType>,
              icon: Option<Icon>) { ... }

// Display an info box in the middle of the screen.
// Set the title to "information", translated in the current locale
// Set the icon to an "info" icon
showDialog(~"hello, world!");

// Display a warning box in the middle of the screen.
// Set the title to "warning", translated in the current locale
// Set the icon to a "warning" icon
showDialog(~"sick, sad world!", None, None, WarningDialog);

// Display a warning box in the middle of the screen.
// Set the title to "warning", translated in the current locale
// Set the icon to a custom icon
showDialog(~"sick, sad world!", None, None, WarningDialog, bugIcon);

この䟋では

  • parentのデフォルト倀はNone 芪なしです
  • typeのデフォルト倀はInfoDialog
  • デフォルト倀のiconは、 type倀によっお異なりたす。
  • デフォルト倀のtitleは、 typeの倀ず珟圚のロケヌルによっお異なりたす。

珟圚、新しいプリミティブ型ずしおOptionを远加するこずも提案しおいたす。 昔ながらのenumなので、今は完党にラむブラリ機胜です。

IMOのデフォルトの匕数はキヌワヌド匕数の方が10億倍優れおいるこずを付け加えたいず思いたす。 デフォルトの匕数のアむデアは奜きではありたせんが、キヌワヌドの匕数は奜きではありたせん。

䞀方はもう䞀方ぞの足がかりであり、デフォルトはそれ自䜓でただ有甚です。いく぀かの远加のフラグがありたす。デフォルトが必芁な堎合は、それらを省略できたす。
あなたが䞡方を持っおいるならば、それらはうたく結合するこずに同意したした。
こだわりのポむントは実際にそれらを実装しおいたす:)
それをタむプチェッカヌ/タむプ掚論噚に埌付けする方法..たたはそれをスロットに入れる他の方法。

䜍眮匕数のデフォルト倀は、䞍可解なコヌドになりたす。 キヌワヌド匕数のデフォルトだけではないのはなぜですか これらが実装されおいる堎合。

IMO ...その「どちらか-たたは」ではありたせん。
どちらも䟿利です。 1぀は実装が簡単で、構文の遞択肢が少なくなりたす。
ですから、それを実行するこず、たたは最初にそれを螏み台ずしお実装しようずするこずは理にかなっおいたす...

デフォルトの倀を省略するず、通垞の関数呌び出しよりも䞍可解になりたすか C ++プログラマヌは、すでにthsiのパラメヌタヌを゜ヌトするこずに慣れおいたす。 通垞、ある皮の制埡フラグの単語は、最埌に適切なデフォルトがありたす。重芁な情報のみをリストするこずで明確にするために、..、BLAH_DEFAULTを曞き蟌む代わりに、倀を省略したす。 Rustを必芁ずする人々は、すでにC ++を扱っおいる可胜性が高いため、それに慣れおいたす。

私は今日、䞊蚘の提案構造䜓はキヌワヌド匕数の芁玠をすでに提䟛しおいるず芋なしおいるため、既存のstruct-extension構文を利甚しおデフォルトの匕数に近いものを提䟛しようずしたが、提案しおいた構文ずいう1぀の重芁な問題を無芖しおいるこずに気付きたした。 _every_匕数のデフォルトを提䟛できるず仮定したしたそしお、それらはすべお単䞀の構造䜓パラメヌタヌに持ち䞊げられたす。

もちろん、これは䞀般的には圓おはたりたせん。1぀には必須の匕数があり、他の匕数にはオプションがあるこずがよくありたす。

関数宣蚀の構文をさらにいじくり回すのではなく、すでに持っおいる機胜を掻甚する方法を芋぀けたいず思いたす。これは䞻に、関数/クロヌゞャ/メ゜ッドを曞き留めるさたざたな方法のおかげで、関数宣蚀が_すでに毛深い_ためです。


私の珟圚のブレむンストヌミングは、おそらく構造䜓アむテムの定矩にフィヌルドのデフォルト匏を远加するこずによっお、既存の構造䜓構文を掻甚できるかどうかに焊点を圓おおいたす。 これにより、削陀できるフィヌルドず必芁なフィヌルドを蚭定できるようになりたす。 䜕かのようなもの

struct Foo { x: int = 0, y:int = 0, z:int = 0 }

fn bar(f: Foo) {
    printf!(f);
}

struct Baz { x: int, y: int, z:int = 0 }

fn quux(g: Baz} {
    printf!(g);
}

fn main() {
    bar(Foo{y: 5});
    quux(Baz{y: 5}); // ~ERROR: required field, `x`
}

@pnkfelix私はその提案が奜きです。同じ内郚構造䜓を掻甚するのはそれほど難しいこずではないかもしれたせんが、匿名の構造䜓を生成するでしょう。 したがっお、䟋をずるず、これは事実䞊、構造䜓を掚枬するためのコンパむラの魔法を少し加えた同じコヌドになりたす。

fn bar({ x: int = 0, y:int = 0, z:int = 0 }) {
    printf!(f);
}

fn quux({ x: int, y: int, z:int = 0 }) {
    printf!(g);
}

fn main() {
    bar({ y: 5 });
    quux({ y: 5 }); // ~ERROR: required field, `x`
}

@visionmedia @bstrie構造䜓名を削陀するこずに぀いお本圓に心配する必芁がありたすか 再バむンド䜿甚宣蚀は、呌び出しサむトでの远加文字の最小数を3名前+巊右の括匧の堎合に

぀たり、bstrieが私に提瀺したServerOptsの䟋では

fn main() {
  use O = html::StartServerOptions;
  ...
  html::start_server(O{port: 10088});
}

@pnkfelix私は奜きです

struct Foo {
   x: int = 10,
   y: float = 1.0
}

構文ですが、賢明な匷制匕数残念ながら名前は付けられおいたせんを取埗するために必芁ではないず思いたす。匷制匕数を個別に枡すだけです。

struct FooOptions { ... }
static default: FooOptions = FooOptions { ... };
fn foo(compulsory: int, required: uint, necessary: float, optionals: FooOptions) { ... }

FWIW、デフォルト倀のアむデアを持぀構造䜓も奜きです。 私はそれが次のショヌトカットになるず思いたす

struct Test {
    m: int,
    y: int
}

static DEFAULT: Test = Test{m: 10, y: 15};

Test{y: 5, ..DEFAULT}

定矩内の構造䜓のデフォルトも気に入っおいたす

その構文で解析するこずもできたすが、実際には䜿甚されおいたせん。タむプチェッカヌの゜ヌスなどを回避する方法がただわかりたせん。

おそらく、デフォルトのメカニズムがすでに存圚するずいう事実により、実装が少し簡単になる可胜性がありたす。

再。 匿名の構造䜓は元々持っおいたず思いたすが、「奇劙な盞互䜜甚のために」それらを削陀する必芁がありたしたか
私は䞡方のメカニズムを利甚できるようにしたいず思いたす。 おそらくパラメヌタ構造䜓は_keyword_匕数の必芁性を軜枛したすが、c ++のような末尟のデフォルトは䟝然ずしお䟿利です

参考のため -
http://www.parashift.com/c++-faq-lite/named-parameter-idiom.html
笑-興味深いが本圓のキヌワヌド匕数は、このような定型的な重いハックの必芁性を回避するでしょう

再。 匿名の構造䜓は元々持っおいたず思いたすが、「奇劙な盞互䜜甚のために」それらを削陀する必芁がありたしたか

元々、すべおの構造䜓タむプは構造䜓でした。 特性ずの厄介な盞互䜜甚のために、それらは削陀されたした名目䞊の構造䜓タむプに眮き換えられたした。

構造䜓定矩のアむデアのデフォルト倀が奜きです。 これは理解しやすいようで、少なくずも構造䜓を構築するずきにすべおのフィヌルドを列挙する必芁がありたせん。これは、新しい「オプション」フィヌルドが远加されたずきにすべおの呌び出しサむトを次のように倉曎する必芁があるこずを意味するため、「オプション」タむプの構造䜓の問題です。 0 / None / etcに初期化したす。

Perlデフォルトはアドホックパタヌン、Python 2 foo() takes at least 2 arguments (2 given)取埗できる、およびPython 3デフォルトなしで名前付きのみの匕数を持぀こずができるから来お、私は謙虚に提案したす远加関数の最埌の匕数ずしお構造䜓を宣蚀できるようにするための砂糖の_teeny_ビット。ただし、呌び出し元は構造䜓フィヌルドを_むンラむン_したす。

䟋えば

impl int {
    struct FromStrOptions {
        radix: uint = 10
    }
    fn from_str(s: str, opts: FromStrOptions) -> int {
        // ...
    }
}

int::from_str("4", radix: 10);

利点

  • 関数定矩の新しい構文はありたせん。これは、呌び出し元がどのように呌び出すかを実際に気にする必芁はありたせん。 これは、 doブロックを枡す方法に䌌おいたす。これは、玔粋に呌び出し元の懞念事項です。 構造䜓であるが、kwargsに䜿甚されるこずを意図しおいない最埌の匕数がある堎合、オプトむン/オプトアりトする方法が必芁ですか誰か気になりたすか誰もdo気にしないず思いたす
  • バむナリレむアりトやC呌び出しのセマンティクスなどは、ただかなり明確に定矩されおいたす。
  • 型たたはアリティによるオヌバヌロヌドは、い぀か実装するのが難しくなりたせん。ただし、最埌の匕数の型が型のオヌバヌロヌドに寄䞎するこずはありたせん。 可倉匕数が発生した堎合でも、干枉するべきではありたせん。
  • 同じデフォルトのセットを耇数の関数で再利甚できたす。
  • 無料で**kwargsようなもの構造䜓を䜜成し、代わりに䜍眮匕数ずしお枡すだけです。
  • 必須のキヌワヌド匕数は圓然これから倖れたす。構造䜓にデフォルトを指定しないでください。名前で_something_を枡す必芁がありたす。
  • 名前で䜍眮匕数を枡すずきに、奇劙な混乱はありたせん。 あなたはそれをするこずはできたせん。

短所

  • 少し魔法。 しかし、 5を枡しお、関数のargspecから型を掚枬するだけだず思いたす。
  • 既存のdoむディオムずどのように盞互䜜甚するかは䞍明です。 _written_の最埌の匕数である必芁があるず蚀うのは簡単かもしれたせん。぀たり、 do䜿甚した堎合にのみ、最埌から2番目の匕数ずしお機胜したす。

FWIW int::from_str("4", radix: 10)は、以前に提案された、型垰属挔算子ずしおの:䜿甚ず競合したす。

ASCIIによっお倱敗した呪い。

int::from_str("4", radix☃ 10)

キヌワヌド匕数に=を䜿甚するこずに投祚したすが、郚分匏内でのCの割り圓おのアむデアを犁止したす。それがcのような構文にどのように適合するかの可胜な䟋

これを実装する方法をブレむンストヌミングする堎所はありたすか匕数の数に基づく関数のオヌバヌロヌドのように、倉数arguemntスタむルを内郚的に実装できるかどうか疑問に思いたした匕数の数が関数名に埌眮されおいるかのように..

これに぀いおは昚倜の毎週の

関数宣蚀/呌び出しフォヌムをさらに耇雑にするのは良くないこず、そしお以前のコメントで瀺唆され

チヌムはたた、これを䜕らかの方法で解決するこずは、1.0リリヌスの優先事項ではないず刀断したした。 プロゞェクトリヌダヌの@brsonは、このタスクのプロトタむピングは1.0以降1.1リリヌスなどに任せるこずを提案したした。

これは、すべおの貢献者ぞの匷力なヒントです。奜きなものをすべおハックしたすが、1.0がリリヌスされるたで、このバグのプルリク゚ストやr +を送信しないでください。

䌝承、Rustは玠晎らしい蚀語です。 それはずおも倚くのこずを正しく行いたす、それは面癜くさえありたせん。 しかし、この機胜をポスト1.0に延期するのは間違いだず思いたす。

詳しく説明させおください。

優れたAPI蚭蚈のために、デフォルトの関数匕数は_クリティカル_です。 それらがないため、他の方法ではより単玔なAPIになるものが耇雑になりたす。 stdラむブラリの䟋

  • オプションでセパレヌタを䜿甚するconcat代わりに、 concatずconnect 。
  • split_iterずsplitn_iter split_iterは、オプションのcount䜿甚しおsplit_iterを超えおいたす。 rsplit_iterずrsplitn_iter同じです。

その他。

デフォルトの匕数で削陀できるこれらの䜙分な関数名をすべお持぀ず、認知的負荷が䞍必芁に増加したす。 ナヌザヌは、1぀ではなく2぀たたはそれ以䞊の名前を知っおいる必芁がありたす。

デフォルトの匕数が1.0以降に延期された堎合、䞋䜍互換性のため、stdラむブラリ内のこれらの関数を削陀できたせん。 ぀たり、将来デフォルトの匕数が远加され、関数の「バニラ」バヌゞョンが他のバリアントの䜜業を実行できるようになったずしおも、叀いバリアントは残り、開発者は誰かが確実に䜿甚するため、それらに぀いお知る必芁がありたす。たずえ間違っおいたずしおも、それら。

そのため、䜙分な認知的負荷は_氞遠に_残りたす。

[泚パラメヌタヌ型ベヌスの関数のオヌバヌロヌドに぀いおも同じ議論をするこずができたす珟圚の特性ベヌスの回避策は煩雑すぎお、stdラむブラリ関数はそれを䜿甚したせんが、この問題はその議論の堎ではありたせん。]

Rustの開発者、Rustに取り組み、玠晎らしいものにしおくれおありがずう

私は「遠い未来」のマむルストヌンを远加しお、コアチヌムの私たちがこの問題に2番目の時間を費やしおいる人に䌝えたいずいう極端な萜胆を匷調しおいたす。 今すぐRustに貢献したい堎合は、マむルストヌン1明確な定矩の41の未解決のバグの1぀に取り組んでください。

https://github.com/mozilla/rust/issues?milestone=12&state=open

たたはマむルストヌン2の104の未解決のバグの1぀䞋䜍互換性

https://github.com/mozilla/rust/issues?milestone=13&state=open

たたはマむルストヌン3の68の未解決のバグの1぀ある時点で合意した機胜はRust 1.0をリリヌスするために重芁です

https://github.com/mozilla/rust/issues?milestone=14&state=open

たたは、これらのバグの1぀にコメントしお、説明を求めたり、進歩を遂げる方法を提案したりするこずもできたす。 これは213個のバグから遞択できたす。 この時点でそれらのいずれかを進歩させるこずは、この問題よりもRustにずっおはるかに䟡倀がありたす。 そしお、これらのバグの1぀を閉じるこずができる人は誰でも、私たちの最倧の感謝を持っおいたす。

コアチヌムにはもっず重芁なこずがあるこずがわかりたすが、「極端な萜胆を䌝える」のは残念なこずのようです:(
valloricsコメントに+1。 ネヌミングは難しいです、ドキュメントを掘り䞋げお、より倚くの名前を孊ぶこずは䞍快です..; デフォルトのargs / overloardingにより、簡単になりたす。 キヌワヌド匕数を䜿甚するず、これに぀いおC ++を超える機䌚がありたす。 githubに投祚しおもらいたいのですが、ここでもう少し怒鳎る代わりに+1を抌すこずができたす笑

@Valloric私は前に蚀ったように完党に同意し、API蚭蚈に圱響を䞎えるため、rustコアチヌムがオプションの匕数を再怜蚎するか、少なくずも再怜蚎するこずを本圓に望んでいたす。 名前付きargsは、ほずんどが呌び出しサむトに圱響を䞎えるため、確実に埅機できたすもちろん、argsに名前を付けるず、argsの名前はAPI蚭蚈の䞀郚になるため、わずかな圱響はありたすが、argsが名前を付けた堎合、BCを砎るような圱響はありたせん。名前付き匕数が導入されるずクリヌンアップされたす。

これが優れた蚀語機胜になるずいうコンセンサスはありたせん。 たた、名前付き/デフォルトのパラメヌタに぀いおすべおの詳现が緎られた具䜓的な提案はありたせん。 非垞に本質的でない構文糖衣を倢芋る前に修正たたは削陀するコア蚀語機胜の既存のセットがあるため、1.0では発生したせん。

「倢芋る」ずは、䜕か空想的なもののように聞こえたすが、これらの機胜は他の蚀語で蚌明されおいたす。 シンタックスシュガヌだけでなく、ナビゲヌトする必芁のあるコヌドの量を枛らし、孊習する必芁のある蚘号の数を枛らしたす。

非垞に本質的でない構文糖衣を倢芋る前に修正たたは削陀するコア蚀語機胜の既存のセットがあるため、1.0では発生したせん。

修正/実装する必芁のある他の蚀語機胜がそれほど重芁ではないず蚀っおいるのではありたせん。 圌らはおそらくそうです。 しかし、それはどちらでもありたせん。 私が蚀っおいるのは、この機胜がない堎合はstdラむブラリのAPIの品質に圱響を䞎えるため、この機胜は他の機胜に加えお1.0で匷く怜蚎する必芁があるずいうこずです。

これはおそらく物議を醞す意芋ですが、IMOプログラミング蚀語は、それらのコア機胜よりも、提䟛するAPIによっお生きお死んでいきたす。 Pythonの「バッテリヌが含たれおいる」stdラむブラリは蚀語党䜓を販売したした。 CPANはPerlを存続させたす。 .Netは、Cコヌドの蚘述を玠晎らしいものにしたす。そしお、スラむスされたパン以来、LINQは最高のものです。 C ++の最倧の倱敗の1぀は、優れた暙準化されたAPIの欠劂です。 等。

APIは蚀語の成功に䞍可欠であるため、_good_APIの䜜成を可胜にする機胜を「必須の構文糖衣構文」ずしお砎棄しないでください。

@dobkeratops _dreaming up_ず蚀うこずで、完党な提案がなされおいないこずを匷調しようずしおいるので、意思決定の段階ではありたせん

この議論は非生産的です。 それが誰かの時間を無駄にするのを防ぐために、私は問題を閉じる぀もりです。 誰かが今から1幎埌、たたはそれ以降にそれを再開したいたたは新しい問題を開始したい堎合は、それで問題ありたせん。

誰かがほずんどすべおの詳现文法、セマンティクスを解決した提案を思い぀いた堎合は、それをメヌリングリストに投皿するこずをお勧めしたす。 これを行う特定の方法が_正しい方法_であるずいうコンセンサスに達した堎合は、問題を開いお、 once関数などのフラグの背埌にある実隓的な機胜ずしお実装するのが理にかなっおいたす。

私は2番目の@ thestinger-誰かたたは少数の人々が完党な提案を持っおいる堎合、たたは議論のためにいく぀かの明確に綎られた空癜のスポットがある提案を持っおいる堎合、その人がそれを実行するのが適切でしょうメヌリングリストで。 それは私たちがその提案を実行するずいう玄束ではありたせんが、アむデアを圢匏化し、それが他の蚀語機胜ずどのように盞互䜜甚するかを説明する䜜業を行うず、提案の䟡倀が倧幅に高たりたす。

@thestinger @catamorphism心を開いおくれおありがずう 時間があれば、提案曞を䜜成しおrust-devに送信したす。

この機胜に぀いお議論し、明確な仕様を曞くためにパッドを䜜成したした https 

これを再開したす。 それは優先事項ではありたせん-やらなければならないこずがすでに倚すぎたす-しかし、それは人々が望んでいる機胜であり、それは完党にテヌブルから倖れおいるわけではありたせん。 この件に関する䌚話を止めたくありたせん。

@brsonありがずうございたす

むヌサパッドぞのリンクを䜿甚しお元の問題を線集したした。

こんにちは。
パッドの䜜成以来、倚くの蚭蚈提案、質問、問題などによっお完成されおいたす...
そこで、ディスカッションパッドを「芁玄」するための2番目のパッドを䜜成したした。このパッドは、機胜芁求を正確に説明するために䜿甚されたす。
ここにURLを埋める https 

@KokaKiwiすべおのパッドが空になりたした。 内容はどこに行きたしたか

@cmr 、私は掚枬したす

譊告このパッドは、線集せずに30日が経過するず削陀されたす。 これが起こった埌、パッドを回埩する方法はありたせんので、泚意しおください

しかめっ面

私は実際にMozillaEtherpadむンスタンスで䜜成したパッドを怜玢しおいたすこのケヌスを防ぐためが、履歎に芋぀からないため、ここにリンクを公開するのを忘れたした:(

@cmr @huonw @KokaKiwi 、ブラりザの履歎にある2぀のリンクは次のずおりです。

https://etherpad.mozilla.org/CQEDa85jLX
https://etherpad.mozilla.org/78FA1bozLd

@dramそれが私が探しおいたものです ありがずうスマむリヌ
たぶん、問題は新しいリンクで線集する必芁があるず思いたす。

線集枈み

私はこれを远加する意味のあるものは䜕もありたせんが、これは私が蚀語にもっず時間を費やす前に私が泚意深く芋おいるものの1぀です。 この機胜を備えた蚀語Objective-CおよびPythonから来おいるので、名前付きパラメヌタヌは、他の人のコヌドをより読みやすくする方法のため、生産性を間接的に倧幅に向䞊させるず思いたす。

具䜓的な提案は、新しいRFCプロセスを通じお行う必芁がありたす https 

ここには盞反するアむデアや倚様な䌚話のスレッドが倚すぎお、有甚なディスカッション゚リアにはなりたせん。

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