引子: 不少時候,當我要字符串截取時,我會想到substr和substring的方法,可是具體要怎麼傳參數時,我老是記不住。哪一個應該傳個字符串長度,哪一個又應該傳個開始和結尾的下標,若是我不去查查這兩個函數,我始終不敢去使用它們。因此我老是以爲,這個兩個方法名起的真是蹩腳。然而事實是這樣的嗎?
看來是時候扒一扒這兩個方法的歷史了。
編程
在編程語言的歷史長河中,曾經出現過不少編程語言。然而大浪淘沙,鉛華洗盡以後,不少早已折戟沉沙,有些卻依舊光彩奪目。那麼stubstr與substring的DNA究竟來自何處?編程語言
1950與1960年代
1967-1978:確立了基礎範式
C語言
1980年代:加強、模塊、性能
C++ (就像有類別的C)
1990年代:互聯網時代
Python
Ruby
Java
JavaScript
PHP
Go
Swift (編程語言)
在c語言中,並無出現substr或者substring方法。然而在1983,substr()方法已經出如今C++語言中了。然而這時候尚未出現substring, 因此能夠見得:substr是stustring的老大哥
函數
string substr (size_t pos = 0, size_t len = npos) const;
從C++的方法定義中能夠看到, substr的參數是開始下標,以及字符串長度。
性能
std::string str="We think in generalities, but we live in details."; std::string str2 = str.substr (3,5); // "think"
距離substr()方法出現已經有了將近十年之隔,此間涌現一批後起之秀,如: Python, Ruby, VB之類,然而他們之中並無stustring的基因,在Java的String類中,咱們看到兩個方法。從這兩個方法之中咱們能夠看到:substring方法基本原型的參數是開始和結束的下標。spa
String substring(int beginIndex) // 返回一個新的字符串,它是此字符串的一個子字符串。 String substring(int beginIndex, int endIndex) // 返回一個新字符串,它是此字符串的一個子字符串。
1995年,網景公司招募了Brendan Eich,目的是將Scheme編程語言嵌入到Netscape Navigator中。在開始以前,Netscape Communications與Sun Microsystems公司合做,在Netscape Navigator中引入了更多的靜態編程語言Java,以便與微軟競爭用戶採用Web技術和平臺。網景公司決定,他們想建立的腳本語言將補充Java,而且應該有一個相似的語法,排除採用Perl,Python,TCL或Scheme等其餘語言。爲了捍衛對競爭性提案的JavaScript的想法,公司須要一個原型。 1995年5月,Eich在10天內寫完。
上帝用七天時間創造萬物, Brendan Eich用10天時間創造了一門語言。或許用創造並不合適,由於JavaScript是站在了Perl,Python,TCL或Scheme等其餘巨人的肩膀上而產生的。code
JavaScript並不像C那樣出身名門,在貝爾實驗室精心打造,可是JavaScript在日後的天然選擇
中,並無所以蕭條,反而藉助於C,C++, Java, Perl,Python,TCL, Scheme優秀基因,進化出更增強大強大的生命力。繼承
所以能夠想象,在10天以內,當Brendan Eich寫到String的substr和substring方法時,或許他並沒困惑着兩個方法的參數應該如何設置,由於在C++和Java的實現中,已經有了相似的定義。
若是你瞭解歷史,你就不會困惑如今。ip
以下圖所示:substr和substring都接受兩個參數,他們的第一個參數的含義是相同的,不一樣的是第二個參數。substr的第二個參數是到達結束點的距離,substring是結束的位置。
rem
若有不正確的地方,歡迎指正。字符串