問題タブ [rationale]

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

c++ - C の空の構造体と C++ の空の構造体

Cの空の構造体が制約違反になるのはなぜですか? このルールが C++ で変更されるのはなぜですか?

歴史的な理由はありますか?

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

c++ - std::swapがに移動した理由

C ++ 11 std::swapのヘッダーに移動されたのはなぜですか?<utility>

N3290 C.2.7によると:

17.6.3.2

元の機能への影響:関数スワップが別のヘッダーに移動されました

理論的根拠:スワップの依存関係を削除します。<algorithm>

元の機能への影響:スワップが含まれることを期待してコンパイルされた有効なC ++ 2003コードには<algorithm>、代わりにを含める必要がある場合があります<utility>

太字の部分がわかりません。どのような依存関係が話題になっていますか、そしてその理由は何ですか?

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

dht - DHT はどのように機能しますか?

DHT に関する基本的な考え方は wiki から入手しました。

ストアデータ:

DHT ネットワークでは、すべてのノードが の特定の範囲を担当しますkey-space。ファイルを DHT に保存するには、まずhash the file's name to get the file's key; 2番目にsend a message put(key, file-content) to any node of the DHT、メッセージは責任のあるノードに中継され、keyそのノードはペアを保存します(key, file-content)

データを取得:

DHT からファイルを取得するときは、まず、ファイルの名前をハッシュしてkey;を取得します。2番目に任意のノードにメッセージを送信し、メッセージget(key)を中継します...

質問:

  1. ファイルを保存するには、ファイルの名前をハッシュして を取得できますkeyが、wiki には次のように記載されています。

現実の世界では、キー k は、ファイルの名前のハッシュではなく、ファイルのコンテンツのハッシュであり、ファイルの名前を変更してもユーザーがファイルを見つけるのを妨げないように、コンテンツ アドレス可能なストレージを提供します。

ファイルの内容をハッシュしますか? ファイルの内容を知るにはどうすればよいですか? ファイルの内容を既に知っている場合、なぜ DHT で検索するのでしょうか?

  1. ウィキによると、参加しているすべてのノードは、ファイルを保存するためにいくらかのスペースを確保します。では、DHT に参加した場合、自分が担当spare 10G disk spaceするファイルを保管しなければならないということですか?key falls into the specific key-space

  2. 実際にそれらのファイルを保存するためにいくらかのディスク容量を確保する必要がある場合、それら(key, file-content)をディスクにどのように保存すればよいでしょうか? つまり、ファイルをB-treeディスク上でまたは何かに配置する必要がありますか?

  3. クエリが発生したとき、コンピューターはどのように応答しますか? まず、 をチェックしqueried key、 が にある場合は、ディスク上key-spaceで を見つけます。corresponding file右?

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

powershell - .Invoke() を使用して Powershell スクリプト ブロックを呼び出すと、コレクションが返されるのはなぜですか?

(メソッドを呼び出すことによって) Powershell スクリプト ブロックを呼び出すと、.Invoke()常にコレクションが生成されるようです。具体的には、型のコレクション

System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]

空のスクリプト ブロック ( {}.Invoke()) を呼び出しても、コレクションが返されます。呼び出し演算子 ( ) を使用して同じスクリプト ブロックを呼び出すと&、通常期待される戻り値 (スカラーまたは[object[]]) が生成されます。

これは、配列ではなくコレクションが必要な場合に便利ですが、直感に反するように思えます。

なぜこのように振る舞うのか誰にも分かりますか?

編集:

.Invoke()2 つの異なる呼び出しがあることと.InvokeReturnAsIs()、言語仕様を読むことから知っていました。そこで初めて気が付きました。

命名規則の背後にある理由と、その仕組みが機能しているように見える方法がわかりません。ドキュメントを見ると、デフォルトの呼び出し方法だと思っていたのは、スクリプトブロックが Powershell で呼び出されたときに使用されるものではありません。オブジェクトのストリームを返すだけのように見え.InvokeReturnAsIs()ます。Powershell は、複数のオブジェクトがある場合はオブジェクト配列にラップし、オブジェクトが 1 つしかない場合はスカラーとしてラップします。オブジェクトがない場合は、暗黙的なパイプラインがあるかのように null オブジェクトを作成します。そこの。Using.Invoke()は常にコレクションを返し、Powershell はそれをコレクションのままにします。

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

c++ - C++11 は、std::swap を明示的に呼び出す動作を変更して、boost::swap のように ADL にあるスワップが確実に見つかるようにしますか?

バックグラウンド

この質問については、次のコードを検討してください。

C++03 では、この実装はdo_swap「壊れている」と見なされます。

を明示的に指定することで、引数依存のルックアップによる検索をstd::禁止します。(許可されていないa をコピーしようとns::swapするため、コンパイルに失敗します。)代わりに、次のようにします。std::swapfoo

Nowns::swapが見つかり、std::swapあまり専門化されていないため、使用されません。それは醜いですが、機能し、後から考えると理解できます。boost::swapこれをうまくまとめます (そして、配列のオーバーロードを提供します):

質問

したがって、私の質問はstd::swap次のとおりboost::swapです。そうでない場合、なぜですか?

私には、そうすべきであることは明らかです。変更によって壊れたコードは、おそらく最初は非常に薄っぺらなものでした ( や のようなアルゴリズムとコンテナーはstd::sort十分std::vectorに指定されていませんでした。実装は、ADL スワップを呼び出すかどうかを不確定に呼び出すことができませんでした)。さらに、std::swapが配列に対して定義されるようになったため、まったく変更することは問題外ではありません。

ただし、§17.6.3.2 ではswap、標準ライブラリ内へのすべての呼び出しはstd::修飾なしで行う必要があると指定されていますが (上記のアルゴリズムとコンテナーに関する問題を修正しています)、それstd::swap自体には触れていません。を含む値を交換する例も示しますusing std::swap;。同様に、§20.2.2 (std::swap指定されている場所) は ADL について一言も述べていません。

最後に、GCC は実装で ADL を有効にしませんstd::swap(MSVC も有効にしませんが、それはあまり意味がありません)。std::swapしたがって、の動作を引き継ぐのは間違っているに違いありませboost::swapんが、変更が行われなかった理由がわかりません。:(そして私は一人じゃない

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

base64 - データ URI を Base64 でエンコードする必要がある理由は何ですか?

データ URIを使用すると、画像などの外部リソースを Web ページ内に直接インライン化できます。8 ビット ASCII などの他の単純な形式でより効率的にエンコードできることを考えると、データ URI を Base64 でエンコードすることを要求する設計の正当性は、歴史的または現在のいずれにせよ何ですか?

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

c++ - C++での列挙型アクセスセマンティクスの背後にある理論的根拠

誰かがC++のクラスで定義された列挙型にアクセスするためのセマンティクスに光を当てることができますか?

特に、列挙型メンバーが列挙型自体ではなくクラスの名前でアクセスされるのはなぜですか?がコンテナ/スコープであるとするとenum、同じように、コンテナの要素にアクセスするのは、それがであるときとそうでないときで異なる扱いを受けるのはなぜですか?namespaceclassenumclass

与えられた

完全修飾名がenum1 mynamespace::myclass::enum1ではないのはなぜmynamespace::myclass::myenum::enum1ですか?

後者は「機能」しますが、それを呼び出す「推奨」方法ではなく、一部のコンパイラはそこで警告をスローします。私見、それは正しいだけでなく、それにアクセスする唯一の方法でもあるはずです。

これは非常に奇妙なアクセスルールになりenum1、別の列挙型に新しいものを追加すると非常に奇妙になります(その時点で修飾子を追加する必要があります)。

本当に、それは列挙型の目的を打ち負かします。列挙型のメンバーは、実際には列挙型のメンバーよりもクラスのメンバーであり、他の言語(C#など)での動作の方がはるかに好ましいと私は言わなければなりません。

これはCとの互換性を維持するためだと思いますが、アクセスセマンティクスで列挙型名を要求する方が良いオプションである理由がわかりません...クラス名をオプションにすることがCの互換性を維持するオプションになると思います。

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

c# - Java コンストラクターはそれほど直感的ではありません。あるいは、直感的でないのは Java ではなく、C# なのかもしれません。

この Java コードを指定すると、これは0 と 4 を出力します。

そして、この同一の C# コードでは、これは4 と 4 を出力します

システムを使用する;

Java では出力が 4 と 4 になるはずですが、実際の答えは Java では 0 と 4 です。それから私はC#でそれを試しました、答えは4と4です

何を与える?Java の理論的根拠は、B の構築中、A はまだ初期化中です (したがって、Java が A がまだ初期化中であると言った場合、B はまだ初期化中であると仮定します)。そのため、デフォルト値は 0 である必要があります。したがって、出力は Java では 0 と 4 です。

C# コンストラクターの動作が Java と異なる、またはその逆の理由は?

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

mysql - データベース設計、データベースの合理性は正しいですか? 1 つの主キーから複数の外部キーへ?

テーブル間の関係に関しては、実行したいという考えがあり、データベースの設計に非常に慣れていません。3 つの材料を 3 つ<input type="text">のフィールドに入力して、それらの材料を使用したすべてのレシピを検索できるようにしたいと考えています。

私は3つのテーブルを持っています...

  • 材料
  • レシピ
  • メニュー

太字の列が主キーで、イタリック体の列を外部キーにしたい。

例 - iName は、iName1 iName2 および iName3 の主キーです。


材料

iName - iType

レシピ

mName - iName1 - iName2 - iName3 - メソッド

メニュー

mName - mDisscription - mアレルギー


私の質問は...私のテーブル間の関係は、私がやりたいことに対して十分に効率的ですか? たとえば、結合クエリはどうなるでしょうか

この件に関する光を当てることは大きな助けになります。私はすでにデータベースの1つのテーブルバージョンを持っており、使用しているクエリは正常に動作します。データベースを再設計し、クエリを適切に変更したいだけです。

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

c# - サブクラスでのオーバーライドに干渉するスーパークラスのパブリック非仮想メンバーの背後にある設計理論的根拠

この背後にある設計上の根拠は何ですか:

わかった:

違う:

とにかく非仮想メソッドが仮想メソッドのオーバーライドを妨げるのはなぜですか?

編集:詳細な説明。最初のケース: コンパイラは、メソッドがプライベート (新規) であることを確認するため、クラス C.DoWork() がクラス A.DoWork() をオーバーライドできるようにします (仮想メソッドと非仮想 (B.DoWork()) メソッドを混在させません)。2 番目のケース: コンパイラは public (new) void が宣言されていることを認識し、クラス C でのオーバーライドを任意に (?) 妨害します。シール指定子を使用することもできました。ただし、この場合、通常の非仮想メソッドを宣言するものとして public void DoWork() を記述しましたが、プライベート ケースのように仮想継承チェーンに参加することは期待していません。2番目の例では、次のことを期待しています:

プライベートケースのように C を出力します。