タグ付けされた質問 「language-design」

プログラミング言語のあらゆる側面の設計に関連する質問のタグ。

8
配列は共変であるのにジェネリックは不変なのはなぜですか?
Joshua BlochのEffective Javaから、 配列は、2つの重要な点でジェネリック型と異なります。最初の配列は共変です。ジェネリックスは不変です。 共変とは、XがYのサブタイプの場合、X []もY []のサブタイプになることを意味します。文字列はオブジェクトのサブタイプなので、配列は共変です String[] is subtype of Object[] 不変とは、XがYのサブタイプであるかどうかに関係なく、 List<X> will not be subType of List<Y>. 私の質問は、なぜJavaで配列を共変にする決定をしたのですか?なぜ配列は不変なのにリストは共変なのかなどの他のSOの投稿があります。、しかしそれらはScalaに焦点を合わせているようで、私はついていけません。

10
プライベートフィールドがインスタンスではなく型に対してプライベートであるのはなぜですか?
C#(および他の多くの言語)では、同じタイプの他のインスタンスのプライベートフィールドにアクセスすることは完全に正当です。例えば: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if (anotherFoo.aBool) ... } } ようにC#の仕様(セクション3.5.1、3.5.2)プライベートフィールドへのアクセスのタイプではなく、インスタンス上で述べています。私はこれについて同僚と話し合っており、(同じインスタンスへのアクセスを制限するのではなく)このように機能する理由を考え出そうとしています。 考えられる最良の引数は、クラスがプライベートフィールドにアクセスして別のインスタンスとの等価性を判断する可能性がある等価性チェックです。他に理由はありますか?それとも、このように機能しなければならない、または何かが完全に不可能であることを絶対に意味するいくつかの黄金の理由?


5
JavaがThrowableのジェネリックサブクラスを許可しないのはなぜですか?
Java Language Sepecification、第3版によると: ジェネリッククラスがの直接または間接サブクラスである場合、コンパイル時エラーになりますThrowable。 この決定がなされた理由を理解したいと思います。一般的な例外の何が問題になっていますか? (私が知る限り、ジェネリックは単にコンパイル時の構文糖でありObject、.classファイル内でとにかく翻訳されるので、ジェネリッククラスを効果的に宣言することは、すべてがであるかのように行われますObject。間違っている場合は修正してください。)


7
Rubyにプライベートメソッドと保護メソッドの両方があるのはなぜですか?
この記事を読む前に、Rubyのアクセス制御は次のように機能すると思っていました。 public-任意のオブジェクトによってアクセスすることができる(例えばObj.new.public_method) protected -オブジェクト自体およびすべてのサブクラス内からのみアクセスできます private -protectedと同じですが、メソッドはサブクラスに存在しません しかし、ように見えるprotectedし、privateあなたが呼び出すことができないという事実を除いて、同じように動作するprivate(つまり、明示的なレシーバを持つメソッドをself.protected_method動作しますが、self.private_methodしません)。 これの意味は何ですか?メソッドが明示的なレシーバーで呼び出されないようにするシナリオはいつありますか?


9
なぜswitch文は中断を​​必要とするように設計されたのですか?
単純なswitchステートメントがあるとします switch (int) { case 1 : { printf("1\n"); break; } case 2 : { printf("2\n"); } case 3 : { printf("3\n"); } } ケース2にbreakステートメントがない場合、ケース3のコード内で実行が継続されることを意味します。これは偶然ではありません。そのように設計されました。なぜこの決定がなされたのですか?これには、ブロックの自動ブレークセマンティックを使用する場合と比べて、どのような利点がありますか?理論的根拠は何でしたか?
139 c  language-design 

28
「catch」または「finally」のスコープの「try」で変数が宣言されないのはなぜですか?
C#およびJava(およびその他の言語も)では、「try」ブロックで宣言された変数は、対応する「catch」または「finally」ブロックのスコープにはありません。たとえば、次のコードはコンパイルされません。 try { String s = "test"; // (more code...) } catch { Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead } このコードでは、sはtryブロックのスコープ内にのみ存在するため、catchブロックのsへの参照でコンパイル時エラーが発生します。(Javaでは、コンパイルエラーは「sは解決できません」です。C#では、「名前 's'は現在のコンテキストに存在しません」です。) この問題の一般的な解決策は、tryブロック内ではなく、tryブロックの直前に変数を宣言することです。 String s; try { s = "test"; // (more code...) } catch { Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead } ただし、少なくとも私にとっては、(1)これは不格好なソリューションのように感じられ、(2)プログラマーが意図したよりもスコープが広い変数になります(メソッドのコンテキストのみではなく、メソッドの残り全体) try-catch-finally)。 私の質問は、この言語設計の決定の背後にある根拠は何でしたか(Java、C#、および/または他の該当する言語で)?

10
python dict.update()がオブジェクトを返さないのはなぜですか?
私はやろうとしている: award_dict = { "url" : "http://facebook.com", "imageurl" : "http://farm4.static.flickr.com/3431/3939267074_feb9eb19b1_o.png", "count" : 1, } def award(name, count, points, desc_string, my_size, parent) : if my_size > count : a = { "name" : name, "description" : desc_string % count, "points" : points, "parent_award" : parent, } a.update(award_dict) return self.add_award(a, siteAlias, alias).award …

13
C ++に別のヘッダーファイルが必要なのはなぜですか?
C ++が.cppファイルと同じ機能を持つ別のヘッダーファイルを必要とする理由を本当に理解したことがありません。クラスの作成とそれらのリファクタリングが非常に困難になり、プロジェクトに不要なファイルが追加されます。そして、ヘッダーファイルをインクルードする必要があるという問題がありますが、すでにインクルードされているかどうかを明示的に確認する必要があります。 C ++は1998年に承認されましたが、なぜこのように設計されているのですか?別のヘッダーファイルを持つことにはどのような利点がありますか? フォローアップの質問: 含めるコードがすべて.hファイルの場合、コンパイラーはコードが含まれている.cppファイルをどのように見つけますか?.cppファイルが.hファイルと同じ名前であると想定していますか、それとも実際にディレクトリツリー内のすべてのファイルを調べていますか?

24
なぜ変数名が数字で始められないのですか?
私はしばらく前に新しいC ++開発者と一緒に作業していたとき、「なぜ変数名は数字で始められないのですか?」 一部の数値にテキストを含めることができること(123456L、123456U)を除いて、答えを思い付くことができませんでした。コンパイラがアルファ文字を含むすべてを変数名であると考えていた場合、それは不可能です。 それは正解でしたか?他に理由はありますか? string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

9
Rubyがi ++またはi--(インクリメント/デクリメント演算子)をサポートしないのはなぜですか?
前置/後置インクリメント/デクリメント演算子(++および--)は、かなり標準的なプログラミング言語構文です(少なくとも、手続き型言語とオブジェクト指向言語では)。 Rubyがそれらをサポートしないのはなぜですか?+=and -=で同じことを達成できると思いますが、特にそのように簡潔で慣習的であるため、そのようなものを除外することは奇妙に恣意的に思えます。 例: i = 0 #=> 0 i += 1 #=> 1 i #=> 1 i++ #=> expect 2, but as far as I can tell, #=> irb ignores the second + and waits for a second number to add to i 私Fixnumは不変であると理解していますが+=、新しいインスタンスを作成してFixnum設定できるのであれば、同じことをしてみません++か? =文字を含む割り当ての一貫性がこれの唯一の理由ですか、それとも何か不足していますか?

9
String switchステートメントがnullケースをサポートしないのはなぜですか?
Java 7 switchステートメントがnullケースをサポートせず、代わりにスローするのはNullPointerExceptionなぜですか。以下のコメント付きの行を参照してください(例については、Javaチュートリアルの記事switchから引用しています)。 { String month = null; switch (month) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; case "march": monthNumber = 3; break; //case null: default: monthNumber = 0; break; } return monthNumber; } これにより、ifすべてのswitch使用前にnullチェックの条件が回避されます。

8
ヘッダーにC ++インライン関数があるのはなぜですか?
注:これは、インライン関数の使用方法や機能についての問題ではなく、なぜそれらが現在の方法で行われるのかということです。 クラスメンバー関数の宣言では、関数をとして定義する必要はありませんinline。関数の実際の実装のみです。たとえば、ヘッダーファイルでは次のようになります。 struct foo{ void bar(); // no need to define this as inline } なぜクラスのインライン実装では機能しない持っているヘッダファイルにしますか?インライン関数を.cppファイルに配置できないのはなぜですか?インライン定義を.cppファイルに入れようとすると、次の行に沿ってエラーが発生します。 error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)" (?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.