,但我還記得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碼出現了。但是世界這麼大,給你乙個字元,你如何知道這是哪種文字的字元...