追本溯源:substr與substring歷史漫話

引子: 不少時候,當我要字符串截取時,我會想到substr和substring的方法,可是具體要怎麼傳參數時,我老是記不住。哪一個應該傳個字符串長度,哪一個又應該傳個開始和結尾的下標,若是我不去查查這兩個函數,我始終不敢去使用它們。因此我老是以爲,這個兩個方法名起的真是蹩腳。然而事實是這樣的嗎?

看來是時候扒一扒這兩個方法的歷史了。編程

1 基因追本溯源

clipboard.png

在編程語言的歷史長河中,曾經出現過不少編程語言。然而大浪淘沙,鉛華洗盡以後,不少早已折戟沉沙,有些卻依舊光彩奪目。那麼stubstr與substring的DNA究竟來自何處?編程語言

1950與1960年代
  • 1954 - FORTRAN
  • 1958 - LISP
  • 1959 - COBOL
  • 1964 - BASIC
  • 1970 - Pascal
1967-1978:確立了基礎範式
  • 1972 - C語言
  • 1975 - Scheme
  • 1978 - SQL (起先只是一種查詢語言,擴充以後也具有了程序結構)
1980年代:加強、模塊、性能
  • 1983 - C++ (就像有類別的C)
  • 1988 - Tcl
1990年代:互聯網時代
  • 1991 - Python
  • 1991 - Visual Basic
  • 1993 - Ruby
  • 1995 - Java
  • 1995 - Delphi (Object Pascal)
  • 1995 - JavaScript
  • 1995 - PHP
  • 2009 - Go
  • 2014 - Swift (編程語言)

1.1 在C++中首次出現substr()

clipboard.png

在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"

1.2 在Java中首次出現substring()

clipboard.png

距離substr()方法出現已經有了將近十年之隔,此間涌現一批後起之秀,如: Python, Ruby, VB之類,然而他們之中並無stustring的基因,在Java的String類中,咱們看到兩個方法。從這兩個方法之中咱們能夠看到:substring方法基本原型的參數是開始和結束的下標。spa

String substring(int beginIndex) // 返回一個新的字符串,它是此字符串的一個子字符串。

String substring(int beginIndex, int endIndex)
// 返回一個新字符串,它是此字符串的一個子字符串。

1.3 JavaScript的歷史繼承

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

2 因此,substr和substring究竟有什麼不一樣?

以下圖所示:substr和substring都接受兩個參數,他們的第一個參數的含義是相同的,不一樣的是第二個參數。substr的第二個參數是到達結束點的距離,substring是結束的位置。rem

clipboard.png

3 參考文獻

若有不正確的地方,歡迎指正。字符串

相關文章
相關標籤/搜索