web-dev-qa-db-ja.com

使用する前にライブラリを最初に「インポート」する必要があるのはなぜですか?

私の質問はインポートステートメントの使用についてです。

私が出会ったほとんどのプログラミング言語(Python、Scala、Goなど)では、その関数を使用する前に、まずライブラリをインポートする必要があります。

このインポート文を指定する必要があるのはなぜですか?

関数/メソッドを使用するだけで、環境が関連するライブラリ/関数を自動的に見つけて「インポート」できないのはなぜですか?

7
Bernie

その主な理由は3つ考えられます。

  • 関数またはクラスの名前があいまいになる可能性があります。何十もの画像処理ライブラリがあります。どちらからImageクラスを使用しますか?

  • 同時に使用したい複数の同じ名前のクラスがある場合areimport in pythonおよび他の言語の同様のステートメント、 aliasクラス名を許可するので、各クラスを明確な名前で使用できます。これを行うにはステートメントが必要なので、インポートにはそれを使用します。

  • ライブラリがマシンに存在しない可能性があります。失敗したインポート文は、問題を解決するために何をする必要があるかを即座に通知します。実行時の障害はそれほど明白ではありません。

3
whatsisname

提案するものis JavaおよびC#などの一部の言語で可能):使用するクラスの完全修飾名を使用する場合、必要はありません明示的に何かをインポートすると、環境によって自動的に検出されます。

ただし、new System.Web.MailMessage()のような完全修飾名を使用する必要があります。これは面倒です(特により深い名前空間の場合)。名前空間をインポートすることで、new MailMessage()のような非修飾名を使用できます。

では、なぜすべての名前空間がデフォルトでインポートされないのでしょうか?名前の衝突のため。たとえば、両方のSystem.Net.MailMessageSystem.Web.MailMessage。あいまいさを避けるために、インポートするネームスペースを明示的に指定する必要があります。

もちろん、ライブラリ開発者は同じ名前の再利用を避けることができます(一般的には避けることをお勧めします)。しかし、独立して開発された複数のサードパーティライブラリがある場合、これを普遍的に回避する方法はありません。したがって、これはネームスペースとインポートによって解決されます。

Scalaは知りませんが、Javaと同じように機能するのではないかと思います。

Pythonは、その動的な性質によりかなり異なります。 Python importステートメントは、実際にはライブラリファイルのトップレベルのコードを実行します。このコードは、ライブラリの関数とクラスを定義します。したがって、importステートメントがないと、型は単に存在しないので、言語がそれらを見つける方法はありません。

2
JacquesB