最近、Stack OverflowにはPerl嫌悪の集団がありました。そこで、「 お気に入りの言語について嫌いな5つのこと 」の質問をStack Overflowに持ち込むと思いました。あなたの好きな言語を取り、あなたがそれについて嫌いな5つのことを教えてください。それらは、単にあなたを困らせたり、設計上の欠陥を認めたり、パフォーマンスの問題を認識したり、その他のカテゴリにしたりするかもしれません。あなたはただそれを嫌う必要があり、あなたの好きな言語でなければなりません。
他の言語と比較したり、すでに嫌いな言語について話したりしないでください。好きなことを好きな言語で話さないでください。私はあなたが嫌いであるが、他のすべてのものを使用できるように許容するものを聞きたいです、そして私はあなたが他の人が使用したい言語についてそれを聞きたいです。
誰かが私に自分の好きな言語をプッシュしようとするたびに、そして時々インタビューの質問としてこれを尋ねます。お気に入りのツールについて嫌いなものを5つ見つけられない場合、そのツールを提唱したり、それを使って大金を引き寄せたりするのに十分な知識がありません。彼は完全に探求するのに十分な異なる状況でそれを使用していません。彼はそれを文化や宗教として主張しています。つまり、自分の好きなテクノロジーを選択しなければ、私は間違っているということです。
どの言語を使用するかはあまり気にしません。特定の言語を使用したくないですか?しないでください。デューデリジェンスを経て、十分な情報に基づいた選択を行い、それでも使用しないのですか?いいよ正しい答えは、「あなたには良い実践とBarでの豊富な経験を持つ強力なプログラミングチームがいます。Fooに変更するのは愚かなことです」です。
これは、コードレビューにも適した質問です。コードベースを本当に知っている人はそれについてのあらゆる種類の提案を持ち、あまりよく知らない人は非特定の苦情を持ちます。 「このプロジェクトをやり直すことができたら、どうしますか?」この幻想的な土地では、ユーザーとプログラマーは、自分が好きではないあらゆるものに不平を言うようになります。 「より良いインターフェースが欲しい」、「モデルをビューから分離したい」、「このモジュールの代わりにこのモジュールを使用したい」、「このメソッドのセットの名前を変更したい」、またはそれらが本当にするもの現在の状況が好きではありません。これが、特定の開発者がコードベースについてどれだけ知っているかを把握する方法です。それはまた、プログラマーの自我がどれだけ私に言っていることに縛られているかについての手がかりでもあります。
憎しみは、人々がどれだけ知っているかを理解する唯一の側面ではありませんが、私はそれがかなり良いものであることがわかりました。彼らが嫌いなものは、彼らが主題についてどれだけよく考えているかを示す手掛かりにもなります。
PHP
そしてはるかに主観的に:
Python
共通のLISP
私のお気に入りの言語で一番嫌いなのは、私の選択が変わり続けることです。 The Oneを見つけたと思うたびに、5つ(またはそれ以上)嫌いなものを見つけます。そして、あそこの芝生はもっと緑に見えます...
Python:
私はまだpythonの適度なユーザーであるため、私の苦情は知識のロックまたは誤用である可能性があります。コメントを歓迎します。私はこの言語が大好きです。
私は人々が速度について文句を言うのを見ました。わかりません。そのインタープリター言語、ランタイムまでマシンコードにコンパイルされないコード、それはまさにその性質です。インタプリタ言語とコンパイルされた言語の速度を比較することはできません。私が見る限り、インタープリタ/スクリプト言語の中で、pythonは遅くありません。
PHP:
共通のLISP
強く型付けされたLISPはどのようなものになるのだろうか
私は実際にフルタイムで使用することはできないので、手足に出かけますが、とにかく試してみます!
Perl 6
最初の3つは言語です。残りは実際には言語そのものではなく、まだ公開されていないという事実です。
Perl
私はこの言語が大好きで、すでに使用されているものを追加したくありませんが、誰もまだこれについて言及していないので、私はそれをポットに投げます。この機能を使用したとき、それが私の人生で最も恐ろしい経験であることがわかりました(そして、アセンブリ言語で働いてきました)。
write()
およびformat()
関数。想像できる最悪の、uい、最も恐ろしい単一の構文がありますが、まだanyよりも多くの機能を提供することはできませんsome(無限にきれいな)printf()
が動作します。 誰もはeverこれらの2つの関数を使用して出力を行わないでください、単にそれらがいかに悪いかという理由だけで。
私は誰かが意見を異にするだろうと確信していますが、彼らが私の問題を解決することを望んで、彼らを調べたとき、私は彼らが「ビッグ・リボウスキを引用する」「痛みの世界」であるとわかり、Perl6がそれらを使用するか、より良い方法で完全に書き直して、より使いやすく便利なものにします。
Python
ハスケル
型システムが逆に感じることがあります。コンパイラに変数の型を推測させたくない場合はどうすればよいですか?上記の変数の制約チェックを行う逆の場合はどうなりますか?たとえば、リストの要素の型を推測する代わりに、それらがすべて特定の型クラスに属していることを確認します。これは微妙ですが大きな違いであり、UIのプログラミングが困難になります。実行できますが、他の言語で実行するよりも多くの労力が必要です。 HaskellはUI以外の部分を好むが、UIは型付けされていない言語に任せる。
無限値の構築を許可すると、時には非常にイライラするエラーが発生します。
NoMonomorphismRestriction。
バイト文字列の処理は時々お尻に噛みつき、あなたがそれらを不適切に混ぜたためにプログラムがクラッシュするまであなたはそれを知りません。ここで何かが間違っています。これを防ぐはずの型情報が失われているときです。
型クラスは、目撃型のような些細な場合に自動的に派生する必要がありますが、乱用の可能性が高いです。
C
c#:
1)静的メソッドはクラスのメンバーでなければなりません
2)静的拡張メソッドは静的クラスにのみ追加できます
3)インターフェイス関数の実装には、「オーバーライド」などのマークが付けられていないため、基本クラスまたはインターフェイスからのものであることが示されます(コードレビューだけで、(正しい署名を使用して)期待するメソッドをオーバーライドすることを困難にします) 。
私はちょうど3を持っています。私はそれがかなり良いと思います。
C#
私はその愚かさを知っていますが、データ型を自分で欲しいものに変換したいのです。(int)
やConvert.ToInt32
などを追加する必要はありません。時間を節約できます。そして、int
を出力するために何かを書いたときに、long
が必要であることが判明した場合、それを機能させるために、行ったことをすべて変更しなければならないことがよくあります。私のためにそれをしてください!
申し訳ありませんが、5つは考えられませんでしたが、私は新しいので、多分私は戻って、後でもっと追加するでしょう:P
C++が嫌いな5つのこと
#define STR_LINE2(x) #x
#define STR_LINE(x) STR_LINE2(x)
#define LINE_NUMBER STR_LINE(__LINE__)
Python、再び:
スイッチキーワードはありません。いいえ、辞書はそれに代わるものではありません。 Elif
ステートメントの束でさえありません。
一貫性のない改行処理。なぜできるのですか:
test = (1,
2,
3)
ではなく:
from itertools import cycle,
islice,
izip
なぜできないのですか:
if stuff \
and foo \
or bar:
return "Formated string with %(arg)s" % \
{'arg': "bloody slash"}
スラッシュを使用せずに?
明白で唯一の方法はありません。 PythonはそのモットーでJavaが「どこでも一度実行してください」で失敗したように失敗します。
# what somebody from an another language would do
if not test.has_key('foo'):
test['foo'] = 0
n = test['foo'] = test['foo'] + 1
対
# what an agnostic beginer would do
try:
test['foo'] += 1
except KeyError:
test['foo'] = 1
n = test['foo']
対
# what you end up after looking for dictionary default value in the python doc
test.setdefault('foo', 0)
n = test['foo'] = test['foo'] + 1
対
# what I would do
n = test['foo'] = test.get('foo', 0) + 1
そして最悪なのは、彼らが同じことをまったく行わないことです。微妙な違いがあります。
スペースとタブの選択。選択肢はないはずです。選んで、石に入れて、戦いをやめます.
なぜあなたはそれを行うことができます:
test = {}
test['foo'] = 0
だがしかし:
test = []
test[] = 0
追伸:" ".join(l)
は素晴らしい人です。文句を言うのはやめましょう、それは明らかではありませんが、イテレータパターンを念頭に置いて、それを行う正しい方法です。
C#
dynamic
はこのほとんどを解決するはずですが、まだリリースされていません。EL-式言語、JSPページの${...}
および#{...}
の事柄、および基礎となるJavaコードからデータをプルアップするために使用されるJSF 2.0 Facelets。
C#
IComparable
vs. IEquatable
vs. IComparable<T>
vs object.Equals vs. operator ==などなど。拡張により、これらすべてを満たすカスタム型を作成することは、必要以上に多くの作業を行います(特にコレクションクラスの場合)。明らかに、言語設計者はこれを認識しているため、linq、foreach、コレクション初期化子など、インターフェイスごとではなく形状ごとに機能するさまざまな回避策があります。const
)using
は限定的ですが、知っておくと便利な代替品です!)私がNemerleで再送する5つのこと:
C++
C
編集:CのCPANについて考えながら、私は...私はそのようなことを何と呼び、「ccan」を考え、それをグーグルで考えて、これに出会いました: http://ccan.ozlabs .org /
しかし、まだ初期段階にあるようです。
R(統計のRプロジェクト)
VBA(言語が悪いと思ったため)
Python
lambda
sにステートメントがありません。 GRRRRfoo( a for b in c if d )
は間違っていると感じますが、それを逃すたびに驚きます。 foo( (a for b in c if d) )
であってはいけませんか?yield
ステートメントを含めるだけで、関数は魔法のようにジェネレーターに変換され、インターフェイスが完全に変更されます。また、そのジェネレーターは、最初のnext()
の前に作業を行うことはできません。少なくとも、ジェネレーターを返す関数を使用せずに。JavaScript
for each ( foo )
の構文と動作は、後付けのように感じられます。Clojure
C#について:
C++優れたリファクタリングツールの欠如、チェック済み例外の欠如
Javaテンプレートの欠如、const
キーワードの欠如
Java-言語レベルでの構成のサポートなし
C#
REBOL
REBOLはamong私のお気に入りの言語です。 Haskellのランクもかなり高いですが、お気に入りがあるとは言えません。
その奇妙な構文は、試してみる前に多くの開発者を怖がらせます。
使用[メールルールのURL] [
; A small DSL that sends email to people about URLs.
rules: [
some [
into [
set email email!
set url url!
(send/subject email url reform [ "Check Out" url ])
]
]
]
; Global context
notify: func [ [catch] dsl [block!] ] [
unless parse dsl rules [
throw make error! "You screwed up somehow."
]
]
] notify [[[email protected] http://www.google.com] [[email protected] http:// www .yahoo.com]]
再帰的な方言はPARSE
で検証するのは非常に簡単ですが、評価するのは非常に困難です。 (スタックはここで役立ちます。)
BLOCK!
データ型はXMLでできることのほとんどすべてを実行できるため、これは部分的にthis慢であると思われます。ただし、現実の世界にはXMLが含まれています。今後のREBOL 3では、最後の問題を除き、これらの問題の多くが修正されることを期待しています。
好きな言語を選択するのは不可能だと思います。動的な型付けと静的な型付けを比較することはできないため、使用するものをリストするだけです
C++:
::value
を使用すると、より簡潔になります->.
コンパイラがptr.thing
を実行していることを理解できず、単に->
を実行できないのはなぜですか?vector<vector<int>>
全体をvector<vector<int> >
にする必要があるため、そのコード行を見るたびに集中できず、int[][]
または何かを使用する方法を見つけようとすることになります;
が嫌いですPython:
Python:配列の部分選択では、要求したものが得られません。
a [1]は1つの要素を提供します
a [1:2]は、[a [1]、a [2]]ではなく、1つの要素を提供します
a [1:3]は2つの要素を与えます
私はそれが嫌いですが、多分それは私が主にVerilogで働いているからかもしれません。
多くの人によるとJavaは遅いですが、ある程度の使用には同意します。
Javaは劇的です。彼らはあなたがしたいただ一つのことのためにたくさんのクラスを持っています。ただし、柔軟性プロパティXDは知っています。
Javaは最初は難しいが、いつものように楽しい。
「Hello、World!」を印刷するための簡単なコードを書いているときJavaを使用しないでください! XD私は正当だと確信しています。
Javaは混合なので、純粋にOOP言語とは言わないでください。
さらに多くありますが、私は5つのXDに制限されています。ありがとう!
C#
C#のペット嫌いの一番の理由は次のとおりです。
(1)イベントはすべてのリスナーへの強力な参照を持っているため、イベントをリッスンするもののガベージコレクションを防ぎます。問題を確認したい場合は、「弱い参照イベントハンドラー」のようなものを作成して問題を解決しようとしたすべての人々をネット上で検索するだけです。
(2)呼び出す前にイベントがnullに等しいかどうかを確認する必要があるのは、言語で処理する必要があるように思えます。
(3) XMLシリアライザーには、XMLファイルのコメントを読み書きする方法がありません。 XMLファイルが手作業とC#で記述されたツールの両方で変更される環境では、あまり良くありません。生のXmlDocumentを使用するだけで回避できますが、それをクラスに抽象化できると便利です。
(4)ビルドプロセスでは、xsdファイルなどに直接アクセスできません。代わりに、C#部分クラスを作成する中間ステップが必要です。また、これにより、XAMLファイルで問題が発生し、変更を適切に行うために2回再構築する必要がある場合があります。
(5) MMXやSSE 1,2,3,4などのCPU組み込み関数はサポートされていないため、C#アプリを実行するとこれらの貴重なCPU機能は利用できません。
私のトップ5にならなかった他の人:
(6)フィールドをプロパティとしてタグ付けできません。すべてのプロパティは、get goから明示的に実装する必要があります。
例えば。現在あります:
public class MyClass {
private int someInt;
public int SomeInt {
get {
return someInt;
}
set {
someInt = value;
}
}
}
したい
public class MyClass {
[IsProperty(public, get, set)]
private int someInt;
}
(7)複数の戻り値のサポートなし:例:
public int, string, double MyFunction()
{
....
return x,y,z;
}
public void TestMyFunction()
{
int x, string y, double z = MyFunction();
}
(8)共変戻り型のサポートなし
ジェネリックの実装には不満がありますが、それをカットします。 C#は、すべてのGUI、ネットワーク、および構成配管を行うための優れた言語であり、長期的にサポートできる方法で物事を迅速に立ち上げ、稼働させるための私のナンバーワンの言語だと思います。
C++
MEL(マヤ式言語):
AutoDeskがPythonを二次的なスクリプト言語として採用した理由は次のとおりです。
Python:
Delphi for My 5:
•コミュニティが小さすぎます。近くに別のスピーカーを見つけるのが簡単でない場合、優れた言語イマージョンプログラムを取得することはほとんど不可能です。
• 不規則動詞。はい、英語とスペイン語でも言及されていることは知っていますが、ケニアは発明でした。なぜ不規則な動詞が必要なのですか?
•Unicodeのサポートはありません。ほとんどのメッセージを読むには、コンピューターに3つの異なるTengwarフォントが必要です。そのうちのいくつかはカーニングが不十分です。これは、ローマ字表記の存在を考えると、それほど大きな問題ではありませんが、Tengwarはとても美しいので、使用したくありません。
。
JavaScript
ECMAScript 5仕様から:
7.6.1.2将来の予約語:
クラス、列挙、拡張、スーパー、const、エクスポート、インポート
厳密モード: implements、let、private、public、interface、package、protected、static、yield
OK、最後の1つを楽しんでいますが、7種類の混乱を招く
C#
1)値型のジェネリックを書く実用的な能力の欠如。たとえば、すべてのばか(ほとんどのばか)は、C++でint、float、doubleなどのリストの標準偏差を計算するルーチンを記述できます。簡単に記述でき、読みやすく、高速な非汎用コードとして実行できます。 。他の2つでばかげたことなく、これら3つのうちの1つに近いC#で何かを書くことができれば、あなたは本当に素晴らしいプログラマーだと思います。
2)共分散と反分散。ただし、これは4に追加されます。
3)LINQの非常に質の悪いドキュメント(さて、実際には言語の一部ではありません)。
4)前回と少し違うことを除いて毎回同じことをしたいときにforeach/iteratorを使用しようとしています(たとえば、それらとWordの間、最後の2つの間にコンマで文字列の束を連結します)。 IEnumerableで記述した場合、書き込みと読み取りが難しく、for(int i = 0 i <...)を使用した場合はあまり良くなく、効率も悪くなります。
5)これについて苦情を申し立てることは知っているが、チェックされた例外はない。これはJavaのように実装する必要はありません(フレームワーク開発者は、なぜそうしなかったのかについて非常に良い点を述べています)。チェックされた例外がオフになることを好まない。
言語があると仮定する必要があります。私たちは?
Python
私が理解していないもの...
math.ceil()
およびmath.floor()
は、整数ではなく浮動小数点数を返します(おそらく、基礎となるC関数での整数オーバーフローを回避するためですが、Python longにキャストしないのはなぜですか?)len()
はメソッドではなく関数ですreload()
は非常に制限されており、10回のうち9回はモジュールをリロードしません。モジュールである場合はインポートしたラベルのみをリロードします。つまり、foo自体がモジュールでない場合はfrom bar import foo; reload(foo)
実装に基づいて意味を成しているが、迷惑なもの...
array.sort()
は配列を返しません(インプレースで発生すると思います)for
ループの構文シュガーだけですか?)およびPython 3で修正されたカップル
global
は最上位の名前空間のみを参照できますPython:
標準のGUIツールキットはありません(コミュニティはこれについてぐるぐる回っていますが、なにも解決しないようです)。
Pythonアプリとライブラリを配布およびインストールするためのツールと方法の進化は、非常に困難です。 (最近では、これは修正に近づいているようです。)
インタプリタが進むにつれてCPythonはまだ低速です(最近PyPyはかなり見栄えが良いのですが、「標準」Pythonになればこの問題はなくなります)。
多くのメソッドをオーバーライドせずに、組み込みクラス(リストや辞書など)をサブクラス化することはできません。イベントへの単純なフック(追加または削除されるアイテムへのフックなど)リストから、delitem、append、extend、insert、pop、およびremoveをオーバーライドする必要があります。サブクラス化可能な「変更」イベント通知や、使用される一般的なコードを除外する「保護」メソッドはありません。上記のすべての方法で)。
Virtualenvが発明されるまで、1台のマシン上で異なる目的のために別々のPython環境を維持することは本当に苦痛でした。
私はC#に非常に満足していますが、これら2つは本当に私を困らせます:
不変クラスのコンストラクタベースの初期化は、インラインオブジェクトの初期化よりもIDEバッキングが少ないため、利便性が低く、直観的ではありません(コードを読んだときに、何に何を割り当てるかがわかりません)。これにより、必然的に可変クラスに傾くようになります。これは以前にも言及したことは知っていますが、不変クラスの初期化構文には厳密に問題があります。
switch
は冗長すぎます。スイッチが適切である状況を見るときはいつでも、それがより簡潔であるという理由だけでif..else if..
を使用する傾向があります(タイピングが30%少ない)。スイッチのフォールスルーはないはずだ、break
が暗示され、case
がコンマで区切られた値のリストを許可するべきだと思う。
Scala:
ルビー:
Java:
VB .NET。ただし、VB6はプログラマーの世代全体を汚染したため
私はVB6ショップだったVB .NETショップで働いており、ここで働いていたVB6開発者だったすべての人は、.NETについて何も学ぶことを断固として拒否しています。彼らはまだVB6であるかのようにコーディングしており、彼らのアプリはVB6アプリがやったように吸います。上司は、他の人が理解するのが難しすぎるのではないかと恐れているため、LINQの使用を積極的に推奨していません。
MSがC#を使用した場合、私たちはすべて良くなったと思います。これは、中括弧がVBの詳細な終了ステートメントよりもはるかに劣っていると思うからです。
ルビー。
list.empty?
は、list.is_empty
またはlen(list) != 0
よりも優れています。同様に、process.kill!
はprocess.kill
よりも優れています。 RubyとLISPがこれを正しました。dict.items
またはdict.items()
? Rubyもこれを正しく取得しました。Ruby
さらに考えた後、これを書き直し...
PHPが嫌いな5つのこと(好きではありません):
それらは私を悩ます言語機能(または欠如)ですが、はるかに大きな問題は、これらのより多くの人々/コミュニティ関連のものです:
PHPを使用する多くの人々が、プログラミングやグッドプラクティス全般について何も知らず、本当に厄介なコードを生成するという事実。 JavaScriptにも同じ問題があります。
本当に悪い習慣とスタイルを教える膨大な量のチュートリアル/本。これが#3の主な原因である可能性があります。
それが主に#3と#4のために発展した悪い評判。
C#
Java
Cは私のお気に入りですが、それはまた恐ろしいです。
Python用にもう1つ追加できます。
リストl = [l1, l2, ..., ln]
、次にrepr(l) = [repr(l1), repr(l2), ..., repr(ln)]
、ただしstr(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l))
を指定します。これは、l = ["foo], [bar,", "],["]
やstr(l)
のようなリストにcouldあいまいなエントリがあるため、「ユーザーを混乱させる可能性がある」"[foo], [bar, ], []"
を返すために決定されました。ただし、これにより、str
をデータのダンプだけに使用することはできなくなります。これは、listが「読み取り可能な形式でデータをダンプする」だけだからです。ああ!
Objective-C 2.0
ライブラリではなく、特定の順序ではなく、言語とランタイムに厳密にこだわります。
Python:
1)スクリプト言語であり、完全にコンパイルされたものではありません(バイナリをコンパイルできることを望みます。バイトコードは気にしません)。非常に多くのライブラリを使用する必要がある場合、これは非常に面倒です(つまり、プログラムを使用するすべての人がすべてのライブラリをインストールする必要があります。これは、基本的に、私は不必要であるべき大量の仕事をしています)。私はバイナリを作成する方法を知っていますが、alwaysは機能せず、とにかくバイナリにインタプリタをバンドルしていると思います(そして、私はそれを望んでいません)。これで、インポートしたすべてのファイルのコピーを含むバイトコードコンパイラー(およびそれらのみ)をプログラムのフォルダーに配置できる場合、それは適切な妥協策となる可能性があります(追加のライブラリーをダウンロードする必要はありませんそのような)。また、コンパイル済みのpythonファイルを、これを実行する前にプログラムを実行するファイルとして指定された1つのファイルに圧縮できると便利です。
2)時々少しバグがあるようです。特に、「from moduleX import *」などのコードに関連するコード、およびその他のインポート関連の問題、および関連するいくつかの問題に関連するいくつかの問題がありました。グローバル変数およびローカル変数。
3)最大再帰深度はより高くなる可能性があります。もっと高くするために必要だと感じたことが少なくとも一度ありました。
4)switchステートメントはありません(数値、文字列、範囲を許可するステートメントはもちろんのこと)
5)新しいPythonバージョンは、多くの便利な文字列操作を廃止しているようであり、それらを使用せずに同じことを行う方法についての簡単なドキュメントがないようです。
6)強制的な自動ガベージコレクション(手動で行うにはableにしたいが、必ずしもそうする必要はない)。
7)GUIを使用せずに事前に作成されたTimerクラスはありません(まあ、あるかもしれませんが、検索をすべて行った後、見つけるのは便利ではありません!実際に何かを見つけましたが、それはしませんでしたタイマーとは、x秒ごとに指定された機能を実行し、必要に応じてオフにする機能などを備えたソートを意味します。
8)例を挙げているコミュニティの人々は、自分がどのモジュールをインポートし、どのようにインポートしたかをめったに伝えません。
9)Luaとの統合のサポートはあまりありません。
10)必要な機能を備えたオブジェクトでオブジェクト変数をそのクラスに動的に追加しない限り、クラスの特定のインスタンスに(クラス全体ではなく)追加の機能を追加する方法はないようです。 (それでも、そのために別のクラスを作成する必要があります)。
Python:
C#のプリプロセッサの欠如。
一部の人々が虐待する可能性があるため、彼らがそれを除外したことは知っていますが、私は彼らが赤ちゃんを風呂水で捨てたと思います。コード生成は良いことと見なされており、C++ではプリプロセッサが私の第一線のコードジェネレーターでした。
5。ヌル結合演算子
??演算子を使用すると、次のことができます。
x = y ?? z;
の代わりに:
x = (y == null) ? y : z;
私はこの演算子が好きですが、別のものが欲しいです:
x = y ??? y.foo() : z.foo();
の代わりに
x = (y == null) ? y.foo() : z.foo();
私はこの種のものを常に使用していますが、== null
部分を入力するのは面倒です。
4。同等のサポートが必要です
すべてのEquals(object obj)
メソッドを次のように開始する必要があります。MyClass other = obj as MyClass; if(other == null)falseを返します。
あなただけを書く必要があります:
public override bool Equals(MyClass other) {...}
そして、言語はEquals(object obj)
メソッドを提供する必要があります。
注:otherはnullでないことを保証する必要があります。
。異なるタイプの三項演算子は使用できません
これはコンパイルされず、そうすべきだと思います!
string foo = "hello";
int bar = 4;
object baz = foo == null ? foo : bar;
2。名前空間プライベートの欠如
internal
保護が好きですが、同じ名前空間内からのアクセスのみを許可する保護があればいいのにと思います。これは、大規模なクラスライブラリでのアクセスをより適切に制御するのに適しています。
1。多重継承なし
インターフェースのデフォルト実装には、実際に実装(クラス)継承のみを使用しますが、それだけを行いたい場合がたくさんあります。
VB.NET
1)If Not xは "foo"(<> "foo"の代わりに)
2)「OrElse」と「AndAlso」の短絡(異なる動作をする「Or」と「And」の代わりに)
3)なし(Nullの代わり)
C#でGenericメソッドを作成するときに、Enumを型制約として使用できないことを発見しました。
Microsoftには、理由について十分な説明がありますが、それでもです。私が怒ってんだ
public static T MyFunc<T>(string arg) where T:Enum //wont work :(
私は1つしか持っていませんが、共有する価値があると思います。
CSharp/.NET
配列の要素数を取得するLengthプロパティと、コレクションの要素数を取得するCountプロパティがあります。 CLRが自動的にIList、ICollection、IEnumerableをシーンの背後にあるゼロベースの1次元配列に追加するという事実を考慮すると、より奇妙に見えます。
CLRチームとBCLチームはこの問題について議論するのに苦労したと思います;)
C
JavaScript
Python
path
-これを修正するための型モジュールは拒否されました。([f for f in os.listdir('/file/path') if os.path.isfile(os.path.join('/file/path', f))]
)
a := 3
と言うだけでなく、put 3 into a
と言う必要があります)itemDelimiter
で項目を区切り、手動でエスケープします。 get Word 2 of line 5 of txt
のような行と単語を取得することもできます余談ですが、HyperTalkに固有の最もクールな機能の1つは、特別なit
変数です。
ask "How many years old are you?"
answer "You are " & it*12 & " months old."
JavaFX
Lua
Java:
C#
Item o()
(ある場合は自動破棄)を(のような)書きたいです。Python:
1)行継続構文:「... \」は機能しますが、「... \」は機能せず、編集者による異常なeolマークなしで、通常、後続のスペースは見えません。
2)スタックトレースは以前に発生した例外のように見えるため、スタックトレースでは裸の「レイズ」は見えません。
3)遅い
4)Webサーバーへの不十分な統合(mod_python:dead、mod_wsgi:操作範囲の制限)。これは3]によって複雑になり、デーモン化または何らかの種類のメモリ持続性が必要です。
5)タブとスペースの混在に対する許容度が高いため、フローを制御するための変更が非表示のままになることがあります。 (最近のバージョンで修正された可能性があります)
Lua:
組み込みのエラーシステムは絶対に恐ろしいです
Luaインタープリターを変更することにより、try-catchシステムを実装できます。ただし、組み込み関数によってスローされるエラーとの互換性はありません。
セッターとして__setindexの代わりに__newindexを持っているという事実
...および__newindexは、キーがまだ存在しない場合にのみ起動されます。存在する場合、メタメソッドはまったく呼び出されません。
適切な型比較システムはありません。
Type()関数がありますが、基本的なタイプのみを処理します(すべてのテーブルはテーブルです)。型比較のためのメタメソッドが本当に必要です。 「is」演算子と__typeメタメソッドを使用してこれを実装したことがありますが、本当にうまく機能します。
新しいキーワードを定義するのはめったにありません。
あなたはそれを行うことができますが、Lua内のコードは十分に文書化されていないので、望む結果を得る方法を見つけることは一種の試行錯誤です。これは、上記で説明したことを自分で実装する場合の大きな問題です(ただし、__ setindexではなく、簡単に変更できます)。
Webブラウザでは使用できません。
ええ、言語自体に問題はありませんが、いまいましい、Javascriptの代わりにLuaを使用できるようになりたいです... :)
Object Pascal:
これは単なる言語であり、標準ライブラリとすさまじいIDEの残念な言い訳は、独自のリストに値します。