天天看點

流行程式設計語言的詳細對比(2)--包管理

包管理

Java

定義包:

包語句的文法格式為:

package pkg1[.pkg2[.pkg3…]];
           

引用:

import package1[.package2…].(classname|*);
           

Js

定義包:

<script>
    (function(){  
                  
                //自己的命名空間,外部無法通路。  
                //定義了自己的函數$()  
                Function $()  
                {  
                    //代碼。  
                    //測試是否成功。  
                    alert("你好!");  
                }  
                //構造自己的命名空間。  
                Window['myNameSpace']={}  
                //将自己的命名空間注冊到window,并且注冊自己的$函數。  
                Window['myNameSpace']['$']=$;  
       })();  
</script>
           

引用:

<html>  
<head>  
    <title>js庫測試</title>  
    <script type="text/javascript" src="myNameSpace.js"></script>  
</head>  
/*調用自己建立的 $()方法。window可以省略*/  
<body οnlοad="window.myNameSpace.$();">  
</body>  
</html>
           

ES6

/*-----export [test.js]-----*/
let myName = "Tom";
let myAge = 20;
let myfn = function(){
    return "My name is" + myName + "! I'm '" + myAge + "years old."
}
let myClass =  class myClass {
    static a = "yeah!";
}
export { myName, myAge, myfn, myClass }
 
/*-----import [xxx.js]-----*/
import { myName, myAge, myfn, myClass } from "./test.js";
console.log(myfn());// My name is Tom! I'm 20 years old.
console.log(myAge);// 20
console.log(myName);// Tom
console.log(myClass.a );// yeah!
           

Python

定義包:

包是一個分層次的檔案目錄結構,它定義了一個由子產品及子包,和子包下的子包等組成的Python的應用環境。

在Phone目錄下建立file init.py:

Phone/init.py

引用:

當你導入Phone時,為了能夠使用所有函數,你需要在__init__.py裡使用顯式的導入語句,如下:

from Pots import Pots
from Isdn import Isdn
from G3 import G3
           

當你把這些代碼添加到__init__.py之後,導入Phone包的時候這些類就全都是可用的了。

import Phone 
Phone.Pots()
Phone.Isdn()
Phone.G3()
           

Go

(1)package關鍵字定義包:

package xxx

(2)import(

“fmt”

)

然後我們代碼裡面可以通過如下的方式調用

fmt.Println(“hello world”)

上面這個fmt是Go語言的标準庫,他其實是去goroot下去加載該子產品,當然Go的import還支援如下兩種方式來加載自己寫的子產品:

相對路徑

import “./model” //目前檔案同一目錄的model目錄,但是不建議這種方式來import

絕對路徑

import “shorturl/model” //加載gopath/src/shorturl/model子產品

(3)程式的初始化和執行都起始于main包。如果main包還導入了其它的包,那麼就會在編譯時将它們依次導入。有時一個包會被多個包同時導入,那麼它隻會被導入一次(例如很多包可能都會用到fmt包,但它隻會被導入一次,因為沒有必要導入多次)。當一個包被導入時,如果該包還導入了其它的包,那麼會先将其它包導入進來,然後再對這些包中的包級常量和變量進行初始化,接着執行init函數(如果有的話),依次類推。等所有被導入的包都加載完畢了,就會開始對main包中的包級常量和變量進行初始化,然後執行main包中的init函數(如果存在的話),最後執行main函數。

1). 點操作

我們有時候會看到如下的方式導入包

import(

. “fmt”

)

這個點操作的含義就是這個包導入之後在你調用這個包的函數時,你可以省略字首的包名,也就是前面你調

用的fmt.Println(“hello world”)可以省略的寫成Println(“hello world”)

2). 别名操作

别名操作顧名思義我們可以把包命名成另一個我們用起來容易記憶的名字

import(

f “fmt”

)

别名操作的話調用包函數時字首變成了我們的字首,即f.Println(“hello world”)

3). _操作

這個操作經常是讓很多人費解的一個操作符,請看下面這個import

import (

“database/sql”

_ “github.com/ziutek/mymysql/godrv”

)

_操作其實是引入該包,而不直接使用包裡面的函數,而是調用了該包裡面的init函數。

Scala

定義包:

Scala 使用 package 關鍵字定義包,在Scala将代碼定義到某個包中有兩種方式:

第一種方法和 Java 一樣,在檔案的頭定義包名,這種方法就後續所有代碼都放在該包中。 比如:

package com.runoob

class HelloWorld

第二種方法有些類似 C#,如:

package com.runoob {

class HelloWorld

}

第二種方法,可以在一個檔案中定義多個包。

引用:

Scala 使用 import 關鍵字引用包。

import java.awt.Color // 引入Color

import java.awt._ // 引入包内所有成員

def handler(evt: event.ActionEvent) { // java.awt.event.ActionEvent

… // 因為引入了java.awt,是以可以省去前面的部分

}

import語句可以出現在任何地方,而不是隻能在檔案頂部。import的效果從開始延伸到語句塊的結束。這可以大幅減少名稱沖突的可能性。

如果想要引入包中的幾個成員,可以使用selector(選取器):

import java.awt.{Color, Font}

// 重命名成員

import java.util.{HashMap => JavaHashMap}

// 隐藏成員

import java.util.{HashMap => , } // 引入了util包的所有成員,但是HashMap被隐藏了

注意:預設情況下,Scala 總會引入 java.lang. 、 scala. 和 Predef._,這裡也能解釋,為什麼以scala開頭的包,在使用時都是省去scala.的。

PHP

/*定義空間:*/
namespace Foo\Bar\subnamespace; 

1、使用use操作符導入/使用别名
<?php
namespace foo;
use My\Full\Classname as Another;
//下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 導入一個全局類
use \ArrayObject;

$obj = new namespace\Another; // 執行個體化 foo\Another 對象
$obj = new Another; // 執行個體化 My\Full\Classname 對象
NSname\subns\func(); // 調用函數 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); 
// 執行個體化 ArrayObject 對象
// 如果不使用 "use \ArrayObject" ,則執行個體化一個 foo\ArrayObject 對象
?>
2、 一行中包含多個use語句
<?php
use My\Full\Classname as Another, My\Full\NSname;
// 執行個體化 My\Full\Classname 對象
$obj = new Another; 
// 調用函數 My\Full\NSname\subns\func
NSname\subns\func(); 
?>
//導入操作是在編譯執行的,但動态的類名稱、函數名稱或常量名稱則不是。
3、導入和動态名稱
<?php
use My\Full\Classname as Another;
 // 執行個體化一個 My\Full\Classname 對象
$obj = new Another;
$a = 'Another';
 // 實際化一個 Another 對象
$obj = new $a;     
?>
另外,導入操作隻影響非限定名稱和限定名稱。完全限定名稱由于是确定的,故不受導入的影響。
4、導入和完全限定名稱
<?php
use My\Full\Classname as Another;
$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>