問題タブ [mutability]
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.
c# - Pythonのid()に相当するC#?
Pythonのid()に相当するC#はありますか?そうでない場合、オブジェクトが変更されたかどうかをテストするにはどうすればよいですか?たとえば、Pythonでは、不変オブジェクトは次のようになります。
と可変のもの:
編集-これまでの回答のほとんどは比較関数/演算子に関するものですが、比較されている値にもっと興味があります。私は最初はそれについてはっきりしていませんでした、そして私はObject.ReferenceEquals
答えとして受け入れています。
java - Javaメソッド呼び出しで引数を変更しないでください
次のようなメソッドを呼び出したい場合:
メソッドを呼び出す場合を除いて、すべて問題ありません。実際にその引数を変更します。とにかくその周りにありますか?
javaでlを変更しないようにfを宣言する方法はありますか?
l に対してディープ クローンを実行して渡すことができることはわかっていますが、l が非常に大きい場合、この操作はコストがかかります。
dictionary - スキーム手順を作成しようとしています
make-odd-mapper というスキーム プロシージャを作成しようとしています! 1つの入力、プロシージャを受け取り、出力としてプロシージャを生成するプロシージャであると想定されています
元:
(定義 i4 (mlist 10 2 30 4))
(i4)
{10 2 30 4}
((make-odd-mapper! add-one) i4)
i4
{11 2 31 4}
問題が入力リストとその set-mcar を変更する必要があることはわかっています。および void はその一部です...誰かがこれを解決するための合理的なコード行を教えてくれますか? 誰かが突然変異について疑問に思っている場合に役立ちます...そしてそれを使用して、プロシージャを出力として作成するプロシージャを作成します....
c - C99:スレッドセーフを文書化するための制限されたポインタ?
この質問は、制限付きの技術的な使用法ではなく、主観的な使用法に関するものです。技術的に制限がどのように機能するかについては誤解されているかもしれませんが、その場合は、誤った前提に基づいて質問をするために私をグリルしてください。
これまでのところ、restrictedを使用している2つの例を次に示します。
不変の文字のシーケンスへのポインターを受け取る関数がある場合、他の人が関数の実行と同時に、たとえば別の並列から、自分のポインターを介してデータにアクセスできるため、制限されているとは言えません。スレッド。データは変更されていないので、問題ありません。
ただし、関数が変更する可能性のある一連の可変文字へのポインターを取得する場合、潜在的に一貫性のないデータによる関数。また、データが変更される可能性も記載されているため、コーダーは古いデータを読み取らないこと、およびアクセスするときなどにメモリバリアを使用する必要があることを認識しています...
私はあまりCをコーディングしていないので、ここで想定していることについて簡単に間違っている可能性があります。これはrestrictの正しい使用法ですか?このシナリオで行う価値はありますか?
また、関数が戻ったときに制限付きポインターがスタックからポップされると、他のポインターを介してデータに自由にアクセスできるようになり、制限は制限付きポインターの間だけ続くと想定しています。「非公式」ポインターを介して制限されたデータにアクセスするのはUBであるため、これはルールに従ったコーダーに依存していることを私は知っています。
私はこれをすべて正しく理解しましたか?
編集:
ユーザーが複数のスレッドを介してデータにアクセスするのを妨げることはまったくないことをすでに知っていることを明確にしておきたいと思います。また、C89には「スレッド」が何であるかさえ知らないことも知っています。
ただし、参照を介して引数を変更できるコンテキストを考えると、関数の実行中に引数にアクセスしてはならないことは明らかです。これはスレッドセーフを強制するために何もしませんが、あなた自身のリスクで関数の実行中にあなた自身のポインタを介してデータを変更することを明確に文書化します。
スレッド化が完全に方程式から外されたとしても、それが私にとって正しいと思われるシナリオでは、さらに最適化することができます。
それでも、これまでのすべての信頼できる回答に感謝します。気に入ったすべての回答に賛成しますか、それとも受け入れた回答だけに賛成しますか?複数が受け入れられた場合はどうなりますか?申し訳ありませんが、私はここで新しいです、私は今FAQをより徹底的に調べます...
java - スレッドセーフでない方法での非スレッドセーフオブジェクトフィールドの公開
Javaの同時実行性に問題があります。はい、ほぼ同じタイトルの質問を見ましたが、それらはすべて微妙に異なることを質問しているようでした。はい、JavaConcurrencyinPracticeを読みました。はい、それがトピックの事実上の参照である理由がわかります。はい、スレッドセーフクラスでのフィールドの公開に関するセクションを特に読みました。はい、誰かが私にその本を単に指し示すことを知っているという事実に関係なく、私はまだJavaで並行性の質問をするつもりです。
しかし、これは私を困惑させました-揮発性および/または同期アクセスを備えた正しい読み取り/書き込み順序を保証することにより、スレッドセーフな方法で可変プリミティブフィールドを簡単に公開できること、および64ビットプリミティブにはアトミックアクセスが必要であることを知っています読み取り/書き込み操作の原子性が不足しているためです。クラスのフィールドの特定の「スナップショット」で実行する必要があるコードのチャンクにロックを使用することについて知っています。AtomicLong<>などの機能を備えたアトミックパッケージを十分に認識しています。
しかし、スレッドセーフでないオブジェクトをスレッドセーフクラスのフィールドとして公開することに関しては、まだ混乱しています。
私が見ることができることから、ゲッターでそれへの参照を返すとすぐに、あなたはいつでも使用できる呼び出し元にオブジェクトのコンテンツへの前例のないアクセスを与えました。また、セッターを指定すると、セッターを使用しているオブジェクトの外部で制御できる可能性のあるオブジェクトへのオブジェクト参照を設定できるようになります。
とにかく、スレッドセーフでないオブジェクトからスレッドセーフなクラスを作成するには、それらをすべてプライベート/保護し、すべてのメソッドのクラスにスレッドセーフなラッパーメソッドを作成して、すべての非スレッドセーフなオブジェクトを作成する必要があります。クラスのユーザーが使用したいと思うかもしれないことを持っている。そして、これは定型的な悪夢のように聞こえます。
つまり、ゲッターのオブジェクトにAtomicReference <>を返すと、.get()を使用して、同期されていないアクセスを再度取得できます。
私が考えたもう1つの方法は、すべてのゲッターが古いオブジェクトに基づいてスレッドセーフでないオブジェクトの新しいコピーを返すようにすることでした。つまり、セッターにも同じことが適用され、変更は無関係になります。しかし、Javaには、オブジェクトのクローンを作成するための絶望的に複雑なシステム(浅いコピー、深いコピー、特定のコピーなど)があります。また、これは非常に非効率的であるため、Clojureのような不変性用に設計された言語を使用するよりも速くはありません。実際、そのような言語では、複数の不変データが舞台裏で同じデータを共有できることを考えると、おそらくはるかに遅くなります。
では、公開された非スレッドセーフオブジェクトのスレッドセーフクラスを実行可能な方法で作成するにはどうすればよいですか?
前もって感謝します。
go - Google Go 言語で可変型と不変型はどれですか?
Google Go で、文字列は不変であると読みましたが、わかりましたが int ですか? 他のタイプはどうですか?少し年上のプログラマーとして、私は不変性の利点を知っていても可変性を好み、危険な生活を好みます。
どのタイプが可変または不変であるかを知ることは非常に役立ちます。
更新、私が最も心配しているのは、型が可変か不変かによって決まる実際的な問題です。Java の典型的な例のように、ループ内で String を作成し、10,000 回ループすると、10,000 個の String が作成され、後でガベージ コレクションされます。これは、実際に私が働いていた会社のプロジェクトで深刻な問題でした。
問題は、Go の不変性が場合によっては同じ問題を引き起こすかどうかです。
変数の扱い方に影響します。(または、そうだと思います)。
もう一度更新します。他の実際的な問題についても心配しています。何かが不変であることを知っているということは、並列であり、オブジェクトの 1 つの参照を更新しても他の参照を更新しないコードを書くことができるということです。しかし、時には危険なことをしたい、可変性が欲しい。
これらは、可変性と不変性の結果であり、コードの記述方法に影響します。
immutability - jQueryオブジェクトは不変ですか?
こんにちは、jQuery の初心者です。jQuery オブジェクトが不変であるかどうか疑問に思っていました。例えば:
obj1 と obj2 は同じ意味で、obj2 は obj1 を参照しますか?
アップデート:
上記の例は、私が知りたいことの表面を引っかいたようなものですが、より正確な質問は次のとおりです。jQuery API から関数をチェーンすると、同じオブジェクトまたは新しいオブジェクトが返されますか (Java の文字列の場合と同様)?
functional-programming - 関数型プログラミングコースの最後にある 2 つの質問
以下は、コースの講義ノートから直接、修了したばかりのプログラムの設計方法 (簡略化されたラケット) コースから得られる 2 つの最大のもののようです。
1) 末尾呼び出しの最適化、および非関数型言語でのその欠如:
残念ながら、他のほとんどの言語は TAIL CALL OPTIMIZATION をサポートしていません。別の言い方をすれば、テールコールでもスタックを構築します。
テール コールの最適化は、ほとんどの言語の主要な要素が開発されてからずっと後の 70 年代半ばに発明されました。テール コールの最適化がないため、これらの言語は、任意のサイズのデータをトラバースできるようにする固定の LOOPING CONSTRUCTS セットを提供します。
a) この種の最適化を特徴としない手続き型言語で、このタイプの最適化に相当するものは何ですか? b) これらの等価物を使用することは、スタックを持たない言語で同様の状況でスタックを構築することを避けることを意味しますか?
2) 変異とマルチコア プロセッサ
このメカニズムは、プログラミングで使用する他のほとんどすべての言語の基本です。いくつかの理由により、これまで導入を遅らせてきました。
基本的であるにもかかわらず、驚くほど複雑です
これを使いすぎると、プログラムが並列化 (複数のプロセッサで実行) に対応できなくなります。マルチコア コンピューターが一般的になった現在、必要なときにのみミューテーションを使用する機能がますます重要になっています。
ミューテーションを使いすぎると、プログラムを理解するのが難しくなり、プログラムをうまくテストするのが難しくなります。
しかし、可変変数は重要であり、このメカニズムを学ぶことで、Java、Python、および他の多くの言語を使用する準備が整います。そのような言語でも、「ほぼ関数型プログラミング」というスタイルを使いたいものです。
このコースを受講する前に、Java、Python、および C++ をいくつか学んだので、突然変異を当然のことと考えるようになりました。今、それはすべて上記の声明によって空中に放り出されました. 私の質問は次のとおりです。
a) 2 番目の箇条書きで提案されていること、およびそれに対して何をすべきかについて、より詳細な情報をどこで見つけることができますか? b) より不注意なスタイルとは対照的に、「ほとんど関数型プログラミング」スタイルからどのような種類のパターンが出現するかこのコースを受講する代わりに、他の言語を続けていればよかったのではないでしょうか?
python - Python文字列は不変ではありませんか?では、なぜa + "" + bが機能するのでしょうか?
私の理解では、Python文字列は不変であるということでした。
次のコードを試しました。
Pythonは割り当てを防ぐべきではありませんか?私はおそらく何かが欠けています。
何か案が?