Alex學Ruby 最重要的資料型別 字串

2021-09-04 23:59:41 字數 4668 閱讀 3708

,但我還記得c語言裡的字串是以空字元結束的,但

ruby不是,所以,

ruby的字串裡可以包含空字元。

2.  

ruby裡的字串分為兩種,其中最簡單的一種是用單引號括起的字串,表示的完全是字面意義,唯一支援的轉義序列是 單引號和反斜槓

>> str = 'i m \'ok\', a u ok\? \\xie \\'

=> "i m 'ok', a u ok\\? \\xie \\"

>> str = 'i m \'ok\', a u ok\? \\xie \''

=> "i m 'ok', a u ok\\? \\xie '"

另外一種就是雙引號括起來的字串,常用的。

3.   我們也可以用其他方法表示字串,%q和%q,  後面只需要把字串包含到一對分隔符之間就行了,你可以用中括號,小括號,大括號。up to u

>> str = %q[\?***]

=> "\\?***"

>> str = %q[\?***]

=> "?***"

>> str = %q(\?***)

=> "?***"

同樣,你也可以使用非成對分隔符來表示(字母數字空格除外):

>> str = %q* \? yyy \? *

=> "? yyy ?"

由此可見,小q代表單引號,大q代表雙引號。 一般這種字串寫法是有那種需要包含大量元字元的需求下要使用。

4.    我們需要把字串多行表示,但又不想把縮排也作為字串的一部分,那麼就可以用here文件。 關於here文件,我之前只知道其形式:

語法符號《後面加一對開始結束標記,標記之間放你想要的內容即可。

str = <> str = eof

=> "sdfsd\n  eof\n"

2)  但是你可以消除結束標記前面的空格,只需要要用<<- 語法符合:

>> str = <<-eof

sfdsf

eof      #前面有空格,後面沒有空格,

ruby可以識別,但是後面有空格就不行了。

=> "sfdsf\n"

2)   預設的here文件相當於雙引號字串。但是你可以改變其為單引號模式:

>> str = <<'eof'

\? xx

eof=> "  \\? xx\n"

5.   讀取檔案的時候,可以將讀取出來的檔案儲存到字串裡,字串裡就包含了換行符,預設的each方法是按行處理的:

>> str = "tell you a  truth \nlong time ago...\nthe end"

=> "tell you a  truth \nlong time ago...\nthe end"

>> num = 0

=> 0

>> str.each do |s|

?>      num += 1

?>      print "line # : #"

>> end

line 1 : #line 1 : tell you a  truth

line 2 : #line 2 : long time ago...

line 3 : #line 3 : the end

6.   字串轉成字元陣列:

>> str = "abc"

=> "abc"

>> chars = str.scan(/./)

=> ["a", "b", "c"]

7.  一般的字串之間比較通常是比較首字母ascii碼值的大小:

>> ?s         => 115

>> ?u         => 117

>> str1 = "sbu"

=> "sbu"

>> str2 = "usb"

=> "usb"

>> str1 < str2

=> true

>> str1 > str2

=> false

但我們如果想忽略字串首字母來比較呢? 我們可以重寫ufo比較符(<=>):

class string

alias old_compare <=>

def <=>(other)

a = self.dup

b = other.dup

a.gsub!(/^./i,"")

b.gsub!(/^./i,"")

a.strip!

b.strip!

a.old_compare(b)

endend

>> s1 = "ss"            => "ss"

>> s2 = "ub"           => "ub"

>> s1 < s2              => false

>> ?s                       => 115

>> ?u                       => 117

>> ?b                       => 98

注意的是,==運算子並不會呼叫<=>方法,如果我們要自定義的方式來判斷字元是否相等,需要我們重寫== 方法。

8.  有時候我們需要分解字串:

>> str = "foo, bar, foobar, , "               => "foo, bar, foobar, , "

>> l1 = str.split                                     => ["foo,", "bar,", "foobar,", ","]

>> l1 = str.split(",")                               => ["foo", " bar", " foobar", " ", " "]

>> l1 = str.split(",",2)                            => ["foo", " bar, foobar, , "]

>> l1 = str.split(",",4)                             => ["foo", " bar", " foobar", " , "]

>> l1 = str.split(",",6)                             => ["foo", " bar", " foobar", " ", " "]

>> l1 = str.split(",",8)                             => ["foo", " bar", " foobar", " ", " "]

>> l1 = str.split(",",10)                           => ["foo", " bar", " foobar", " ", " "]

>> l1 = str.split(",",-1)                            => ["foo", " bar", " foobar", " ", " "]

>> l1 = str.split(",",-2)                            => ["foo", " bar", " foobar", " ", " "]

9. >> str = "a a b c d d xx"   => "a a b c d d xx"

>> str.downcase                 => "a a b c d d xx"

>> str.upcase                      => "a a b c d d xx"

>> str.capitalize                  => "a a b c d d xx"

>> str.swapcase                 => "a a b c d d xx"

casecmp方法和<=>類似,但是忽略大小寫:

>> "aaa".casecmp("aaa")           => 0

10.  to_s 和 to_str有什麼區別:

原則上任何物件都可以轉換為某種字串表示,這也是幾乎每個核心類都有to_s方法的原因。這是一種強制轉換,但幾乎核心類都沒有實現to_str方法。to_str被認為是一種隱式轉換, 隱式轉換的結果應為物件的真正字串值。 puts方法呼叫物件的to_s方法以獲取其字串表示,這屬於對顯示轉換的隱式呼叫。

class haha

def to_s

"ha"

enddef to_str

"haha"

endend

h = haha.new

puts h

>>        puts "h is " + h

h is haha

>>        puts  "h is " << h

h is haha

>>        puts  "h is #"

h is ha

假如我們有個方法,需要接受乙個字串為引數,但是如果傳個非字串進來會出問題的,我們如何解決這個問題?

1. 可以顯示的呼叫to_s方法把引數轉成字串表示,或者檢查是否為string型別,也可以只管往下執行,但是肯定會報錯。

2.我們可以這麼做:  param = param.to_str rescure param.to_s rescure param

11. #{} 對於全域性變數,類變數和例項變數可以省略大括號。

12.  其他的一些string自帶的操作字串方法。。。

Alex學Ruby 關於多型關聯

剛才看了李妙妙的 這篇文章 感覺說的不是很明白,並沒有從物件導向的角度說清楚,我的理解 要理解多型關聯,首先要理解什麼是多型。多型是物件導向乙個特性。同乙個物件有不同的行為,叫多型。在李舉的那個例子裡,article,image,sound,這三個model會有很多共同的行為,如果沒有使用多型關聯,...

Alex學Ruby 字元編碼與國際化

背景 字元資料是最為重要的資料型別,為什麼呢 因為程式是為人服務的,那些能直接讀懂二進位制資料的超人是很少的 但是如何用二進位制資料表示字元呢 這個時候 編碼 就誕生了,簡單來說,編碼就是二進位制資料和字元之間建立的對映。ascii碼出現了。但是世界這麼大,給你乙個字元,你如何知道這是哪種文字的字元...

Alex學Ruby 字元編碼與國際化

背景 字元資料是最為重要的資料型別,為什麼呢 因為程式是為人服務的,那些能直接讀懂二進位制資料的超人是很少的 但是如何用二進位制資料表示字元呢 這個時候 編碼 就誕生了,簡單來說,編碼就是二進位制資料和字元之間建立的對映。ascii碼出現了。但是世界這麼大,給你乙個字元,你如何知道這是哪種文字的字元...