問題タブ [language-details]
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++ - C++ の chars の整数値の範囲
私はThe C++ Programming Languageを読んでいますが、その中で Stroustrup は、実装に応じて、char の int 値が 0 から 255 または -127 から 127 の範囲になる可能性があると述べています。これは正しいです?-128 から 127 の範囲である必要があるようです。そうでない場合、なぜ 2 番目の実装の可能性で 256 ではなく 255 の値しか使用できないのでしょうか。
c++ - (void) 0 が C および C++ で無操作なのはなぜですか?
NDEBUGが定義されている場合、内部的に として定義されているglibcの debug printfs を見てきました。同様に、for Visual C++ コンパイラもあります。前者は GCC と VC++ コンパイラの両方で動作しますが、後者は VC++ でのみ動作します。これで、上記の両方のステートメントが操作なしとして扱われ、それぞれのコードが生成されないことがわかりました。しかし、ここで疑問があります。(void) 0
__noop
の場合__noop
、MSDN は、コンパイラによって提供される組み込み関数であると述べています。〜に来て(void) 0
、コンパイラによって何も操作されないと解釈されるのはなぜですか? それはC言語のトリッキーな使用法ですか、それとも標準はそれについて明示的に述べていますか? それとも、それはコンパイラの実装と関係がありますか?
python - 一時参照はPythonで自動的にクリアされますか?
これは基本的に、臨時職員の寿命に関する質問です。関数がオブジェクトを返すが、参照が変数に割り当てられておらず、返されたオブジェクトのメソッドを呼び出すためにのみ使用される場合、一時参照は自動的にクリアされますか?
具体的な例を挙げると、次の一連のメソッド呼び出しがあるとします。
行が次のように記述されているかのように、への呼び出しが終了o.method_a()
すると自動的にクリアされるによって返される一時的な参照です。method_b()
編集:一般的な回答に興味があります。CPython は、参照カウントが 0 になるとすぐにオブジェクトをファイナライズします。他の Python 実装では、オブジェクトをすぐにファイナライズしない場合があります。Python 言語は C++ のようなもので、作成されたステートメントの最後で一時オブジェクトが破棄されることを保証するものなのだろうかと思います。(Python を除いて、問題は一時参照が作成されたステートメントの最後にクリアされるかどうかです。)
C++ では、同様のコードを次のように実装できます。
C++ 標準では、「一時オブジェクトは、作成された時点を (語彙的に) 含む完全な式を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。」この例では、std::shared_ptr<B>
への呼び出しによって作成された一時オブジェクトA::method_a()
が、 full-expression の評価の最後にただちに破棄されることを意味しますo.method_a()->method_b();
。a の破棄とstd::shared_ptr
は、共有オブジェクトへの参照をクリアすることを意味します。
python - When should I use @classmethod and when def method(self)?
While integrating a Django app I have not used before, I found two different ways to define functions inside the class. The author seems to use them both distinctively and intentionally. The first one is the one that I myself use a lot:
The other one is the one I never use, mostly because I do not understand when and what to use it for:
The classmethod
decorator in the python documentation says:
A class method receives the class as the implicit first argument, just like an instance method receives the instance.
So I guess cls
refers to Dummy
itself (the class
, not the instance). I do not exactly understand why this exists, because I could always do this:
Is this just for the sake of clarity, or did I miss the most important part: spooky and fascinating things that couldn't be done without it?
java - ジェネリック型の配列を作成できないのはなぜですか?
要するに、これはコンパイルされません:
それは下位互換性の問題によるものですか、それともそれを妨げる言語設計の基本的なものですか?
dart - サブクラスで柔軟に拡張できるように、抽象クラスのコンストラクターを作成する方法
Stack
永続的なデータ構造を実装しようとしています。これを代数データ型として実装したいので、空と非空という 2 つの具体的なサブタイプがあります。
このコードは、具体的な実装で 2 つのエラーを発生させます。
この問題に対処していると思われるサンプル コードを見つけたので、Stack<T>
クラスにパラメーターなしのコンストラクターを配置して修正しました。
しかし今_EmptyStack<T>
、これは定数であるコンストラクターに問題を引き起こします:
さらに、追加されたStack()
コンストラクターにより、クラスを mixin として使用できなくなります。
これらの制限は、クラスの作成者がクラスを拡張する方法について考えるよう強制しているようです。パッケージからクラスを拡張する方法は、List
この結論を裏付けているようです。拡張に使用する別のクラス全体があり、クラス自体dart:collection
を直接拡張することはできません。List
私の質問は、上記の問題よりも一般的なものです。クラスを柔軟に拡張できるようにするには、どうすればクラスを作成できますか? これには、次のような機能の使用を許可することが含まれます。
- スーパークラスのファクトリーコンストラクター
- サブクラスの通常のコンストラクタ
const
サブクラスのコンストラクタ- ミックスインとして使用する
mixin としての使用が不可能であるか、望ましくないことさえあることは理解していますが、他の点は依然として有効です。最も重要な問題はextend
、ファクトリ コンストラクタを持つクラスを作成できない理由です。これは、私がよく知っている他のオブジェクト指向言語とは異なる動作です。
関連する質問:
編集: GünterZöchbauerの回答のおかげで、コードが改善されたため、完全に機能するようになりました(以下を参照)。私が今残されている最も重要な質問は、なぜファクトリ コンストラクターがクラスを拡張する機能を壊すのかということです。そして、それを回避する方法(基本クラスをインターフェースとして使用する以外に)?ポイントを作るためのより簡単な例:
このコードではすべて問題ありません。Base
しかし、時間内にクラスに戻り、ファクトリ メソッドを追加したいとしましょう。
拡張する各クラスBase
は、 のために壊れていunresolved implicit call to super constructor
ます。私は何をしますか?
参照用に元の質問から修正されたコード:
matlab - MATLAB で参照による代入が発生するのはいつですか?
これは MATLAB 言語に関する質問です。MathWorks の「入門」チュートリアルを進めていますが、期待に反する奇妙な「参照による代入」動作 (適切な用語がないため) に気付きました。
以下では、最初に括弧式を評価し、論理配列 [1 0 1 1 1 0 0] を生成し、次にインデックスを付けて結果を取得していると思いますv1
。ここまでは順調ですね。
驚いたのは以下。実行すると、ans (デフォルトの結果変数、無名変数の一種) が[4 1 3 4]
ステートメントの左側の値である値を取得することがわかります。割り当てがansにのみ書き込まれることを期待しますが、代わりに参照によって通過し、参照対象の配列に書き込みますv1
。
もちろん、これは他の言語と同様です。構文ではprint a[3]
の値を取得することを意味しますa[3]
がa[3] = 1
、構文では に新しい値を代入することを意味しますa[3]
。その意味で、唯一の「新しい」部分は、MATLAB がほとんどの言語よりも高度なインデックス式を使用できることです。
ここで紛らわしいのは、MATLAB が式を両方の方法で明確に評価することです。インデックス付きの値を取得してansに格納しますが、それを無視して、右側の値をインデックスによって参照される場所に配置します。
式を 2 回評価したり、舞台裏で他の魔法を実行したりせずに、これを行う方法がわかりません。評価の順番・ルールを把握している気がしません。
「本当に」何が起こっているのかについての洞察をありがとう。