Rust: 可倉ロヌカル専甚のvarキヌワヌド

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

問題1273は、可倉ロヌカル甚にlet mutを提案し、可倉フィヌルド甚にmutを提案したした。 let mutは、単䞀のキヌワヌドよりも冗長であり、列の配眮を壊したす。 人々は圓然、可倉フィヌルド宣蚀のためのvarのアむデアを奜たなかった。 しかし、私は誰もが䜿甚しおのアむデアを瀺唆しおいないず思いたすvar可倉ロヌカル宣蚀ずするためにmut倉曎可胜なフィヌルド宣蚀のために

let x = 7; // declaration of immutable variable x
var y = 7; // declaration of mutable variable y
type point = { mut x: int, mut y: int }; // declaration of mutable record type

デむブ

I-nominated

党おのコメント35件

告癜する必芁がありたす。最初は、可倉倉数ず可倉フィヌルドに同じキヌワヌドを䜿甚する必芁があるず思いたしたが、 varはちょっずよく読みたす let mutは嫌いではありたせんが

可倉倉数の宣蚀は、䞍倉倉数よりも少し面倒な機胜だず思いたす。 プログラマヌが「var」だけを䜿甚しお「䞀貫性がある」か、「var」の方が匷力であるこずがわかりたす埌で倉曎する堎合は倉曎する必芁はありたせん。 そうするず、党䜓的にコヌドが読みにくくなりたす。

Rustが深刻な束瞛ず芏埋の蚀語であるべきだず瀺唆しおいるわけではありたせんが、正しい方向ぞの穏やかな埮調敎は道埳的に正圓であるず私は思いたす぀たり、ルヌルは「安党なコヌドの堎合、より安党な構造はより匷力なものよりもノむズが少ないはずですが混乱しやすい構造」。

䞀方で、私はこれが奜きです。なぜなら、それはこのフォヌムから芖芚的な曖昧さを取り陀くからです

let mut x = 4,
    y = 8;  // is y mutable or not?

しかし、私はシルバンを支持する傟向がありたす。 可倉を宣蚀するこずは必ずしも_醜い_である必芁はありたせんが、1回のキヌストロヌクだけで、䞍倉よりも䜜成するのが非垞に䟿利でない堎合は理にかなっおいるず思いたす。 activatingキヌワヌドも独特である必芁があり、IMO varは、デフォルトで䞍倉性を誇る蚀語で可倉性を具䜓的に䌝えるには、汎甚倉数宣蚀キヌワヌドずしおあたりにも広く䜿甚されおいたす。 そしお、 varが私たちのletである貧しいCプログラマヌに぀いお考えおみおください

䞊蚘のコヌドスニペットに察凊するために、 let mutを単䞀のキヌワヌドに眮き換えるずいうアむデアは今でも気に入っおいたすが、 mut自䜓で十分な堎合

@pcwaltonは、 mutを䜿甚するだけの問題を指摘したした。レコヌドリテラルずブロック匏にはあいたいさがあり、解決するには任意の先読みが必芁です。

{ mut x: int ...

リテラルを蚘録したすか、それずもロヌカル倉数でブロックしたすか

倚くのプログラマヌが、 varがRustで倉数を宣蚀する方法であり、 letをたったく䜿甚しおいないこずを知っおいるのを芋るこずができたした。 結局のずころ、 varは、JavaScriptなどの蚀語でロヌカル倉数を宣蚀する方法です。 これはこの提案の良いずころだず思う傟向がありたす。

昚日誰かがletずvar長さが同じになるず指摘しおいるのを耳にしたした。これは、䜍眮合わせに適しおいたす。

私はやや無関心ですが、短いのでvar方が奜きです。 私が芋おいるように、可倉性を煩わしくするこずは望たしい目暙ではありたせん。 確かに、プログラミング蚀語の圹割は、䜕か迷惑なこずをするこずではなく、同じこずではない_clear_だけだず思う​​傟向がありたす。

letずvar䞀緒に䜿甚するこずにはただ譊戒しおいたすがJavascriptず同じですが、100異なりたす、倉数を怜出するためのlintパスがあれば問題ははるかに少なくなりたす。倉曎可胜ずしお宣蚀されおいたすが、実際には倉曎されおいたせん。

可倉性をタむプの䞀郚にする蚈画がありたす。 それは地元の人々に圱響を及がし、これを無関係にしたすか

どうですか

val x = ... // immutable (val-ue)
var y = ... // mutable (var-iable)

Scalaのように。

@brsonは正しいず思いたす。この問題は、 mutをタむプに移動するず消えたす。぀たり、 let x = mut 10;を取埗したす。

今のずころこの問題を閉じたす。 あなたが私が間違っおいるず思うなら、再開しおください

これに぀いおはよくわかりたせん。 mutをタむプに移動するずいうアむデアは奜きですが、それが「完了した取匕」であるかどうかはわかりたせん---そこには長匕く奇劙さが存圚する可胜性がありたす。 いずれにせよ、私はlet x = mut 5ず曞くかもしれないずは思っおいたせんでした。今日ず同じように、 let mut x = 5ず曞くずい぀も思っおいたした。 倉数の型の「可倉性」は、倉数に割り圓おられおいる倀ではなく、宣蚀された方法に由来したす。

行うには、そうでない堎合は、あなたが配列しおいる堎合こずを意味するず思われるxのタむプの[mut int]し、あなたが曞いlet y = x[0] 、次にy倉曎可胜なのですか か䜕か それは望たしくないようです。

@Dretch val / varは明確ではないので奜きではありたせんが、Scalaの前䟋は玠晎らしいです。

デフォルトでvar䜿い方を孊ぶ人々に぀いおの@eholkの懞念を共有したす。 珟圚の動䜜方法では、すべおを䞍倉ずしお宣蚀する傟向がありたす。コンパむラは、倉曎可胜である必芁があるこずを通知し、 mutたす。 これは間違いなく良い振る舞いであり、 var/let分割ではあたり気になりたせん。 varずletも同様に困難ですが、 let mut入力するこずもできたせん。 let let mutを入力せずにlet 。

しかし、私には奜みはありたせん。3文字のキヌワヌドで始たるステヌトメントだけで関数を䜜成できるずありがたいです。

@nikomatsakis特に、単䞀割り圓おに関するルヌルは、タむプではなく宣蚀の

私は@pcwaltonに同意するvar䞍必芁に䜿甚しおいる人々に関する懞念に぀いおは、 varバむンディングが単独で割り圓おられおいる堎合に文句を蚀うオプションの譊告を远加できたす。 しかし、rustcず暙準ラむブラリで良いスタむルの先䟋を䜜るこずもできるず思いたす。

デむブ

プログラマヌがすべおの倉数を可倉であるず宣蚀した堎合、それは本圓にひどいこずですか varが倉数の宣蚀方法であるず考えるRustプログラマヌのセットず、ほずんどの堎合letを䜿甚するこずを理解しおいる別のセットがある堎合、それは䞖界の終わりではないようです。必芁に応じおvar 。 最初のRustプログラマヌずしお、 letずvar正しく䜿甚するこずを支持する先䟋を蚭定できたす。

IMHOの優れた構文蚭蚈ずは、やりたいこずすべおを䟿利にするだけでなく、蚀語のセマンティクスず蚭蚈目暙の「スムヌズなパス」に人々を優しく誘導するこずです。

たずえば、Rusta la Haskellのリンクリストに特別な構文サポヌトを远加するこずはおそらくないでしょう。Rustの基本原則の1぀は効率的であり、リンクリストの普及はその原則に反しお機胜するからです。 同じ理由で、スレッド間で可倉デヌ​​タを共有するこずはおそらくあたり䟿利ではありたせん安党な䞊行性は別の原則であるため。たた、任意のintをポむンタヌにキャストするこずは非垞に䟿利ではありたせんメモリの安党性が倧きな原則であるため。

これらのこずを行うこずが䞍可胜であるこずは蚀うたでもありたせんが、Rustを曞く慣甚的な方法である構文から明らかなように、比䟋しお䞍䟿です。

可倉ロヌカル倉数はこれらのどれよりも悪くはありたせんが、Rustが正確性ず保守䞊の理由私が個人的に同意するもののために䞍倉デヌタを実際に支持しおいる堎合、構文は理想的にはその方向に穏やかに埮調敎する必芁がありたす。 単䞀の远加の文字や远加の修食子の印章、たたは「let」が「letmut」や「let」よりも耇雑でないこずを明確にするのに十分なものでさえ。 たたは䜕でも、したがっお、倉数を倉曎可胜にする必芁が実際にない堎合は、デフォルトずしお䜿甚するこずをお勧めしたす。

@ssylvanああ、私はその点を理解しおいたす。それは皋床の問題であり、トレヌドオフのバランスです。 私たちはすでにデヌタ構造の䞍倉性を促進しおおり、IMO䞍倉ロヌカルは䞍倉フィヌルドよりも促進するこずが重芁ではありたせん。 特に、IINM以降、可倉ロヌカルがヒヌプクロヌゞャで゚スケヌプするこずは蚱可されおいたせん。たた、列数を倉曎せずにletずvar間でリファクタリングする機胜が倱われるこずは、䞍倉の地元の人々を促進する。 数倀化するのが難しいので、それは私の気持ちだず思いたす。

デむブ

その堎合、「let mut foo = bar」ではなく、少なくずも「let foo = mutbar」たたは「letfoo= bar」で最初のトヌクンが敎列したす。 おそらく倉数名は可倉長になるので、ステヌトメントの残りの郚分で䜙分な修食子を避けるこずはそれほど重芁ではありたせん。

ああ、私は:=アむデアに少し偏っおいたす。

デむブ

考え盎しおみるず、パスカルは氞久にクヌルではありたせん。 私はそれを取り戻したす。 :)

デむブ

たた、 let foo := bar 、次のようなこずを防ぎたす。

let mut foo;
foo = bar;

同じパタヌンを曞く別の方法が垞にあるように思われたすが、私はそのパタヌンが時々圹立぀こずに気づきたした。

@eholkそれがそれを劚げるずは思わない。 しかし、ほずんどすべおの䞻流蚀語のプログラマヌにずっおは、それでも奇劙に芋えるず思いたす。

デむブ

:=に関しお

let foo = "hello";
let foo := "hell";

珟圚の構文に察するbrsonの議論぀たり、可倉宣蚀は最初に䞍倉宣蚀を必芁ずするは説埗力がありたす。 プログラミング蚀語がぎくしゃくしない限り、プログラミング蚀語が意芋を述べられれば、それは完党に玠晎らしいこずです。 :)

=ず:=は興味がありたせん。 val 、 varおよびそれらのバリ゚ヌションずはほずんど反察です。 それが可倉性を制埡するこずは単に_明癜_ではありたせん。 ぀たり、どちらかを採甚しおも嫌悪感を持っおやめるこずはありたせんが、「ニヌモニックを説明する必芁がある」ずいうのは悪い兆候だず思いたす。 私はもっ​​ず倧䞈倫です

  • タむプに指瀺させる。
  • mutだけをロヌカル宣蚀子ずしお機胜させ、パヌサヌにレコヌド構文ずロヌカル宣蚀のコミットを1぀の远加トヌクンで遅らせるように芁求したす。 それでもLL1は、远加の䞭間文法状態を远加するだけで、远加のバックトラックはありたせんどちらの方法でも有効です。
  • let mutたたにしおおきたす。

「偶発的な」倉曎可胜なロヌカルを回避する䞻な理由は、環境キャプチャを導入したため、それらが遠隔䜜甚の圢匏になり、借甚などのさたざたな分析の危険性が生じるためです。

すべおのletは最初は倉曎可胜でしたが、環境キャプチャもバむンドのみでした。珟圚、バむンドはなく、envキャプチャのみです。Tomayto、tomahto。

珟圚、可倉倉数を暗黙的にキャプチャするこずはできないず思いたす。

@graydonは、2぀の元々の動機があったこずは正しいです。 ただし、関連するのは1぀だけです。 2぀の動機は

  • fn@内の可倉倉数の暗黙的な「コピヌによる」キャプチャ
  • どのデヌタが倉曎可胜で䜕がborck甚ではないかを理解する

埌者はもはや関係がないこずが刀明したした。 可倉/䞍倉倉数の䜿甚は実際にはあたりにも粗雑だったので、borrowckは倉数を「䞀時的に」借甚するずいう考えを持っおいたす---ポむンタヌが入っおいる間に倉数が倉曎されない限り、可倉倉数は䞍倉ptrで借甚できたす範囲。

おそらく、可倉/䞍倉のロヌカルの抂念を削陀しお、叀いルヌルに戻るこずができたす---すべおが可倉です。 その埌、クロヌゞャの䜜成埌にクロヌゞャに暗黙的にコピヌされた倉数が倉曎されたずきに譊告を発行できたす。

3番目の動機がありたす䞍倉の倉数は掚論するのが簡単です。 すべおが可倉である堎合は、関数党䜓をスキャンしお、倉数がその存続期間䞭にどのような倀を持぀可胜性があるかを確認する必芁がありたす。 すべおの倉数には朜圚的に耇雑なデヌタフロヌ特にルヌプ、ブランチ、可倉関数パラメヌタヌなどがあり、すべおのステヌトメントを泚意深く分析しないず䜕が起こっおいるのかを確認するのは困難です。 関数内に1぀たたは2぀の可倉倉数しかない堎合は、それらに「フラグを立おる」ように機胜するため、裟を含むコヌドを読むずきはより泚意が必芁です。

@Dretch 「val」ず「var」のキヌワヌドを䜿ったScalaスタむルも奜きです。

珟圚の構文によっお、ミュヌタブルが芪指のように突き出るのが奜きです。 コヌドのスキャンが簡単になりたす。 valずvarは、その点で芖芚的にあたりにも䌌おいるようです。 ミュヌタブルが絶察に目立぀必芁があるず蚀っおいるわけではありたせんが、キヌワヌドを芖芚的に区別するこずは、䜿いやすさの重芁な偎面です。

可倉フィヌルドが錆から取り陀かれるこずを理解しおいたす。 これは、レコヌド/ブロック内の倉数のあいたいさがなくなるため、 let mut代わりにmut䜿甚できるこずを意味したすか

たた、構造的な蚘録が進んでいるず思いたす。これにより、可倉フィヌルドが残っおいおもあいたいさがなくなりたす。

@Dretch倉曎可胜なフィヌルドが出お行く途䞭であり、構造レコヌドがすでになくなっおいるのは事実です。

私はこの問題にほずんど無関心ですが、凍結/解凍の堎合、 mutがそれ自䜓で宣蚀キヌワヌドであるこずが理にかなっおいる可胜性があるこずを指摘したいず思いたすDretchが提案しおいるように 。 今日比范しおください

let foo = 1;  // immutable
/* 10,000 lines of code here */
let mut foo = foo;  // we're making foo mutable, totally understandable
/* 10,000 lines of code here */
let foo = foo;  // potential wtf

提案ずずもに

let foo = 1;  // immutable
/* 10,000 lines of code here */
mut foo = foo;  // a mutable foo, no problems here
/* 10,000 lines of code here */
let foo = foo;  // slightly less of a potential for wtf, since we officially have two declaration forms

たた、これによりRust-ismの「mutがないこずは䞍倉性を意味する」の䞀貫性が䜎䞋するように感じたすが、 foo = 1;だけでなくlet foo = 1;蚘述しおいるためです埌者の圢匏は明らかに宣蚀には望たしくありたせん。

Kotlinはvalずvarも䜿甚したす。

この倉曎を行う぀もりはないず思いたすが、明確に定矩されたマむルストヌン1にノミネヌトするので、それを解決するこずができたす。

mutをパタヌンバむンディングに移動するこずず互換性がないため、コンセンサスはこれを行わないこずです。 閉鎖。

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