問題タブ [immutability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
7 に答える
4598 参照

c# - クラスがC#で不変かどうかを調べるにはどうすればよいですか?

クラスがC#で不変かどうかを調べるにはどうすればよいですか?

0 投票する
9 に答える
18488 参照

.net - .NETでのSystem.String.Copyの使用は何ですか?

これは非常にばかげた質問だと思いますが、何かが足りないに違いありません。

なぜString.Copy(string)を使いたいのでしょうか?

ドキュメントには方法が記載されています

指定された文字列と同じ値で文字列の新しいインスタンスを作成します。

文字列は.NETで不変であるため、このメソッドを使用する利点が何であるかはわかりません。

すべての実用的な目的のためにと同じ結果をもたらすように思われる

つまり、内部で行われている簿記と、コピーがReferenceEqualsotherStringにないという事実を除いて、観察可能な違いはありません。Stringは、同一性ではなく値に基づいた不変のクラスです。(@Andrew Hareのおかげで、私の元の言い回しは、ingとnotの間に違いがあることに気付いたが、有用なCopy違いがないと認識されていることを懸念するほど正確ではなかったと指摘してくれました。)

もちろん、null引数が渡されると、CopyはをスローしArgumentNullException、「新しいインスタンス」はより多くのメモリを消費する可能性があります。後者はほとんどメリットとは思えず、nullチェックがCopyメソッド全体を保証するのに十分なボーナスであるかどうかはわかりません。

ありがとう。

0 投票する
75 に答える
16310 参照

language-agnostic - 不変コレクションの非変更「追加」メソッドに最適な名前は何ですか?

ふざけたタイトルで申し訳ありません。簡潔なタイトルを思いつくことができれば、質問する必要はありません。

不変のリスト型があるとします。Foo(x)最後に余分な要素として指定された引数を持つ新しい不変リストを返す操作があります。したがって、値が「Hello」、「immutable」、「world」の文字列のリストを作成するには、次のように記述できます。

(これは C# コードです。言語が重要であると思われる場合は、C# の提案に最も関心があります。基本的に言語の問題ではありませんが、言語のイディオムは重要かもしれません。)

重要なことは、既存のリストは変更されないということです。つまり、 0 を返します。Fooempty.Count

最終結果に到達する別の (より慣用的な) 方法は次のとおりです。

私の質問は次のとおりです。Foo に最もふさわしい名前は何ですか?

編集 3 : 後で明らかにするように、型の名前は実際には ではない可能性があるためImmutableList<T>、位置が明確になります。代わりに、それがTestSuite含まれているフレームワーク全体が不変であるため、それが不変であると想像してください...

(編集3の終わり)

これまでに思いついたオプション:

  • Add: .NET では一般的ですが、元のリストの変更を意味します
  • Cons:これは関数型言語の通常の名前だと思いますが、そのような言語の経験がない人には意味がありません
  • Plus:これまでのところ私のお気に入りです。私にとって突然変異を意味するものではありません。どうやらこれはHaskell でも使用されているようですが、少し異なる期待があります (Haskell プログラマーは、1 つの値を他のリストに追加するのではなく、2 つのリストを一緒に追加することを期待するかもしれません)。
  • With: 他のいくつかの不変の規則と一致していますが、IMO とまったく同じ「追加性」はありません。
  • And: あまり説明的ではありません。
  • + の演算子のオーバーロード: 私はこれがあまり好きではありません。一般に、演算子は下位レベルの型にのみ適用する必要があると思います。私は説得されても構わないと思っています!

私が選ぶ基準は以下の通りです。

  • メソッド呼び出しの結果の正しい印象を与えます (つまり、余分な要素を持つ元のリストです)。
  • 既存のリストを変更しないことを可能な限り明確にします
  • 上記の 2 番目の例のように連鎖すると妥当に聞こえます

私が十分に明確にしていない場合は、詳細を尋ねてください...

EDIT 1:を好む理由は次のとおりPlusですAdd。次の 2 行のコードを検討してください。

私の見解では (これ個人的なことですが)、後者は明らかにバグがあります。「x + 5;」と書くようなものです。独自のステートメントとして。最初の行は問題ないように見えますが、不変であることを思い出すまでは。実際、プラス演算子自体がそのオペランドを変更しない方法Plusは、私のお気に入りのもう 1 つの理由です。演算子のオーバーロードのわずかな不快感がなくても、(私にとっては) オペランド (またはこの場合はメソッド ターゲット) を変更しないことを含む同じ意味合いが得られます。

編集 2: Add が気に入らない理由。

さまざまな答えが効果DateTimeStringですReplace。同意します - ここには優先順位があります。DateTime.Addしかし、多くの人がorString.Replaceを呼び出して Mutation を期待しているのを見てきました。たくさんのニュースグループの質問 (そして、掘り下げてみるとおそらく SO の質問) があり、「あなたは の戻り値を無視していますString.Replace。文字列は不変であり、新しい文字列が返されます。」と答えています。

ここで、質問の微妙な点を明らかにする必要があります。型実際には不変リストではなく、別の不変型である可能性があります。特に、テストをスイートに追加すると、新しいスイートが作成されるベンチマーク フレームワークに取り組んでいます。次のことは明らかかもしれません。

何も達成するつもりはありませんが、次のように変更すると、より暗くなります。

それは大丈夫なようです。これは、私にとって、間違いをより明確にします:

それはただ物乞いです:

理想的には、テスト スイートが不変であることをユーザーに伝えなくて済むようにしたいと考えています。成功の穴に落ちてほしい。無理かもしれませんが、やってみたいと思います。

不変のリスト型についてのみ話して、元の質問を単純化しすぎたことをお詫びします。すべてのコレクションが自己記述的であるとは限りませんImmutableList<T>:)

0 投票する
4 に答える
1541 参照

c# - C# での不変型と文字列へのポインターの受け渡しと格納

C# で文字列のような不変型へのポインターを格納する方法はありますか? 実行方法: Instance1.SomeFunction(out MyString);

、Instance1 内の MyString へのポインターを格納しますか?

0 投票する
3 に答える
14723 参照

c# - C# には副作用検証のための機能が含まれていますか (または含まれる予定ですか)?

C# が多くの並列プログラミングをサポートしていることは知っていますが、私の知る限り、副作用を検証するための構成要素はまだありませんよね?

C# が既にレイアウトされている今では、よりトリッキーだと思います。しかし、これを入れる予定はありますか?それとも、F# は、副作用検証のための構造を持つ唯一の .NET 言語ですか?

0 投票する
10 に答える
166246 参照

ruby - Rubyのメソッドでエクスクラメーションマークが使われるのはなぜですか?

Ruby では、問題のオブジェクトが含まれているかどうかを尋ねるような疑問符 ( ?) を持つメソッドがいくつかinclude?あり、これは true/false を返します。

しかし、感嘆符 ( !) が付いているメソッドと付いていないメソッドがあるのはなぜでしょうか?

どういう意味ですか?

0 投票する
15 に答える
9473 参照

oop - 不変性とは何ですか?なぜそれについて心配する必要があるのですか?

不変性に関する記事をいくつか読んだことがありますが、まだその概念にうまく従っていません。

最近ここに不変性についてのスレッドを立てましたが、それ自体が話題なので、今専用のスレッドを立てています。

過去のスレッドで、不変性とはオブジェクトを読み取り専用にし、可視性を低くするプロセスであると考えたことを述べました。別のメンバーは、それとは実際には何の関係もないと言いました. このページ(シリーズの一部) は、不変のクラス/構造体の例を使用し、読み取り専用およびその他の概念を使用してそれをロックします。

この例の場合の状態の定義は正確には何ですか? 状態は、私があまり理解していない概念です。

設計ガイドラインの観点から、不変クラスはユーザー入力を受け入れず、実際には値を返すだけのクラスでなければなりませんか?

私の理解では、情報を返すだけのオブジェクトは不変で「ロックダウン」する必要がありますよね?そのため、その 1 つのメソッドを使用して専用クラスで現在の時刻を返したい場合は、参照型を使用する必要があります。これは型の参照として機能するため、不変性の恩恵を受けます。

0 投票する
7 に答える
1069 参照

c++ - C++で参照を値で渡す方法は?

C++ で不変型 (クラス) を作成しようとしていますが、

すべてのメソッド「別名メンバー関数」がオブジェクトを変更せず、代わりに新しいインスタンスを返すようにしました。

私はたくさんの問題に出くわしていますが、それらはすべて C++ の参照型を中心に展開しています。

1 つの例は、参照によって同じクラス型のパラメーターを渡す場合です。

エラーは、参照によって値を渡すことによって発生します。代わりに、参照を値渡ししていた場合、上記のエラー行はエラーにはなりません!

Java/C# の例を考えてみましょう

C ++でこのようなことを行うにはどうすればよいですか? ポインターを使用できることはわかっていますが、メモリ管理全体が混乱します。オブジェクトへの参照を誰が所有しているかについて心配したくありません。

理想的には、クラスを Python の不変文字列のように設計したいと考えています。それらが不変であることを気付かずに、または知らずに使用でき、期待どおりに動作します。彼らはただ働きます。

編集

もちろん、値渡しまたは一時変数を使用することで回避できます (これは私が現在行っていることです)。私が尋ねているのは、「C ++で参照を値で渡す方法」です

私は答えがSTLの何かを中心に展開することを期待しています.私は現在smart_ptrファミリーのテンプレートを調べています.

アップデート

返信ありがとうございます。ポインタから逃れることはできません。(私の他の質問を参照してください。これは実際にはこの質問のフォローアップです)