問題タブ [assignment-operator]

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 投票する
1 に答える
3236 参照

scala - Scala の割り当てと setter メソッドについて

編集: この質問の原因となったバグは修正されました。


Scala リファレンスで、私は読むことができます (p. 86):

単純変数 x = e への割り当ての解釈は、x の定義によって異なります。x が変更可能な変数を表す場合、代入によって x の現在の値が式 e の評価結果に変更されます。e の型は x の型に適合することが期待されます。x が何らかのテンプレートで定義されたパラメーターなしの関数であり、同じテンプレートにセッター関数 x_= がメンバーとして含まれている場合、代入 x = e はそのセッター関数の呼び出し x_=(e) として解釈されます。同様に、パラメーターなしの関数 x への代入 f .x = e は、呼び出し f.x_=(e) として解釈されます。

したがって、たとえば、次のようなものがうまく機能します。

私はそれから書くことができます

しかし、このようにクラスを定義すると、型パラメーターをメソッド a に追加します。

その後、それは機能しなくなります。error: reassignment to valと書くと が得られますa.a = 10。面白いことに、たとえば、型パラメーターがなくても暗黙的なパラメーター リストが使用されても機能します。

おそらく、この例では、型パラメーターはあまり役に立ちませんが、DSL の設計では、getter に型パラメーターがある場合でも、setter メソッドが呼び出されると便利です (ちなみに、setter に型パラメーターを追加します)。許可され、正常に動作します)。

だから私は3つの質問があります:

  1. 回避策はありますか?
  2. 現在の動作はバグと見なす必要がありますか?
  3. コンパイラが getter メソッドを強制して setter に構文糖衣を使用できるようにするのはなぜですか?

アップデート

これが私が本当にやろうとしていることです。かなり長いです。申し訳ありませんが、避けるつもりでしたが、省略した方が混乱を招くことに気付きました。

私は Scala で SWT を使用して GUI を設計しており、Dave Orme のXScalaWTを使用して非常に楽しんでいます。これにより、必要なコードの量が大幅に削減されます。Composite°C を °F 度に変換する SWT の作成方法に関する彼のブログ投稿の例を次に示します。

ウィジェットを構築する各メソッドの引数は type(WidgetType => Any)*であり、いくつかの便利な暗黙の変換があります。これにより、たとえば、setText()メソッドを持つウィジェットの文字列を直接指定できます。すべてのコンストラクター関数は、シングルトン オブジェクトからインポートされます。

最後に、次の行に沿って何かを書きたいと思います。

これにより、テキストフィールドの編集可能なプロパティが、WritableValue 変数を介してチェックボックスの選択にバインドされます。

まず、名前付き引数はここでは適用できないため、行editable = falseはどこかから来ている必要があります。したがって、シングルトン オブジェクトのウィジェット構築メソッドに沿って、概念的には次のように記述できます。

...しかし、これはゲッターも存在する場合にのみ機能します。すばらしい: <=> でデータバインディングを実装するには、とにかくゲッターが必要です。このようなもの:

これが機能すれば、BindingMaker で <=> を定義でき、この優れた構文を使用できるため、人生はうまくいくでしょう。しかし残念なことに、ゲッターの型パラメーターはセッターを壊します。したがって、私の最初の質問: この単純な型パラメーターが、コンパイラーがセッターを呼び出すための構文糖衣を使用するかどうかに影響するのはなぜですか?

これで少しわかりやすくなったと思います。読んでくれてありがとう…</p>

0 投票する
1 に答える
96 参照

c# - BindingList を設定するときに、デタッチと再アタッチのイベントが必要です

次のコードがあります。

しかし、私は考えるようになりました。これが代入演算子のオーバーロードであることが最善です。次に、彼らが実際にそれを行ったかどうか疑問に思いました。コードを次のように置き換えることができます。

本当ですか?これは:

のいずれかの定義でAddingNewイベントが設定されていますか?NewItemAdded()BoxesToDisplay

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

c - a += b は C の a = a + b よりも効率的ですか?

私はいくつかの言語で次のことを知っています:

次のものよりも効率的です。

一時変数を作成する必要がなくなるためです。これはCの場合ですか?+= を使用する方が効率的ですか(そして、したがってまた-= *=など)

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

c++ - デフォルトのコンストラクターとオブジェクトのコピー

この場合、なぜデフォルトのコンストラクターを宣言する必要があるのか​​疑問に思います。一つには、私がそれを省略した場合、コンパイラはそれを自動的に行いませんか?それにもかかわらず、なぜそれが必要なのかはまだわかりません。また、「obj_B = origin.obj_B;」を省略しても、エラーが発生します。

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

c++ - C++ では、重複したコードを作成せずに、クラスのコピー コンストラクターと代入演算子に同じ機能を与えるにはどうすればよいですか?

重複の可能性:
コピー アンド スワップ イディオムとは何ですか?
C ++でコンストラクターと=演算子のオーバーロードをコピーします:共通関数は可能ですか?

コピー コンストラクターと代入演算子の本体に、実際にコードを重複させずに (関数ヘッダーを除いて) 同じコードを含める方法はありますか?

0 投票する
5 に答える
2179 参照

c++ - 代入演算子をプライベートにして実装しないのはいつですか

これは、代入演算子とコピー コンストラクター、デストラクタを適切な場合に記述することを求める古い試験問題です。

次のコードがあるとします。

答えは次のとおりです。A は U のインスタンスへの C++ 参照を保持します。これはコピーできますが、リセットすることはできません。したがって、次のことを行う必要があります。

• その U を、A ソース インスタンスによって参照される同じインスタンスに初期化するコピー コンストラクターを記述します。

• 代入演算子を非公開にし、実装しない

参照をリセットできないことはわかっています。ただし、クラスに参照メンバー データが含まれている場合は常に代入演算子を使用できないということですか? 次のコードは意味がありますか? 以下のコードは自分で書いたものです(答えではありません)

前もって感謝します。

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

function - Set ( = ) と SetDelayed ( := ) の違いは何ですか?

この議論は前の質問で出てきました.2つの違いを知りたいです. 例のイラストがいいでしょう。

0 投票する
6 に答える
72865 参照

c++ - コピーコンストラクタと代入演算子

オーバーライドoperator=すると、コピーコンストラクターは自動的にnew演算子を使用しますか?同様に、コピーコンストラクターを定義すると、コピーコンストラクターoperator=から動作が自動的に「継承」されますか?

0 投票する
2 に答える
6256 参照

c++ - operator= を非メンバーとしてオーバーロードする

このスレッドへの返信によるとoperator=、非メンバー関数としてオーバーロードすることはできません。したがって、たとえば、次の場合、コンパイラは非常に怒っています。

どうしてこれなの?ゲッターとセッターを含むコンテナー クラスがあるため、メンバー関数は不要であり、カプセル化が壊れます。前述のスレッドへの回答の1つは、「L値が最初のオペランドとして受け取られる」ことを確認することであると述べましたが、それが何を意味するのか完全にはわかりません。誰か明確にしてくれませんか?

さらに、operator=operator()operator[]およびoperator->「オッドボール」ケースはありますか? それとも、オーバーロードされたすべての演算子をメンバー関数として実装する必要がありますか? (そうでなければ完全に合法であることは知っていますが、より良い方法を探しています。)

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

c++ - コンストラクタ、デストラクタ、および代入演算子をコピーします。それらすべてが必要ないのはいつですか?

クラスにcctor、dtor、またはop =を追加するときのC++の経験則は知っています。他の2つも追加して、すべての状況でクラスが適切に機能するようにする必要があります。

3 つすべてを提供する必要がなく、そのうちの 1 つまたは 2 つだけを提供する必要がある場合はありますか?

それらの 1 つをクラスに追加する場合、C++ ではそれらをすべて追加する必要がないのはなぜですか?

EDIT1:

それらのいくつかを必要としないだけでなく、それらを持ちたくないので、それらを非公開または保護したい場合の例について言及しました。ただし、本文が空の場合でも、コードにそれらを記述する必要があります。

空のボディを持つ仮想デストラクタを追加してクラスをポリモーフィックにするときに、それらすべてを持っていない唯一の正当な理由。しかし、デストラクタの本体に何かを書き込むとすぐに、cctor と op= の本体にも何かを書き込むことを検討する必要があります。

3 つのメソッドすべてを記述する必要がなく、初心者がクラスを使用している場合でも、クラスにバグを引き起こすことなくそれらのいくつかを省略できる例を探しています。:)