字串
函式與方法
變數與常數
字串處理
常用方法
String
可以放入任意的文字
也可以放入顯示不出來的文字
Ruby提供了很多處理字串的功能
當字串中沒有任何字就是空字串
雖然沒放東西但本身還是字串
可以對它進行字串操作
字串有許多種表達方式
這也是Ruby的一個特色
上次的Hello World就有用到字串
「'」號來夾住想要表達的文字
最直接的字串表示
'Hello, World'
「"」號夾住想要的字串
比單引號的字串多了些功能
要特別注意其使用
"Hello, World"
字串中可能有單引號或雙引號
或是需要其他特殊的功能
使用跳脫字元顯示特殊的字
單引號字串不能使用
\n: 需要換行時就用
\t: 水平對齊的tab
\a: 蜂鳴器叫一聲(或許不會叫)
\\: 顯示反斜線本身
\' \": 在字串中跳脫中止字元
print "反斜線是\\ 雙引號是\""
觀察 '"' 和 "\"" 的結果
print "1234567\t123456\t12345\t1234"
有時候想要在字串中放入運算結果
把運算寫在字串裡是最快的方法
"1+1=#{1+1}"
使用#{}包住想要的運算
print "#{200+100}"
print "200+100"
print "#{"String!!"}"
print "#{"#{"String!!"}"}"
有時候需要多行的字串
使用跳脫換行很麻煩
直接表達多行字串
<<Nekomimi
喵喵咪~~
咪喵喵~~
Nekomimi
開頭是兩個"<"號
中間就是想要的字串
在頭尾使用一樣的關鍵字夾起來
利用辨識開頭的關鍵字來結束該字串
該關鍵字不能縮排
想要把關鍵字縮排就要加上"-"號
<<-Catear
貓貓咪~~
Catear
用obov當關鍵字
十萬青年十萬肝
可以使用"%"後面加上成對的括號或字元來表示字串
%[這是字串]
%%這也是字串%
%#這還是字串#
可以在"%"後指定一個字元
可以當單引號雙引號表達的替代
還可以表達其他非字串的值
%q{這是單引號字串}
%Q^這是雙引號字串^
試試看使用百分號表達字串吧
頭尾相同字元或成對字元
英文為function
從外部輸入資料後進行處理
不一定回傳運算結果
英文為method
處理的資料除了外部進來還有內部的
操作某個物件內部的數據
因為對物件操作有可能影響內部數據
有些方法會使用"!"的符號來提醒
有對物件操作稱為方法
沒有則稱為函式
傳遞參數可以用小括號或省略
很多時候我們需要把運算結果存下來而非印出來
此時需要用東西來存放
於是需要變數和常數
在Ruby中物件是沒有名字的
變數就是賦與物件一個名字
使用"="來指定變數指向的物件
使用小寫字母開頭就是變數
也可以使用非英文或數字(不建議)
把物件指派給變數
count = 10
str = "string"
狐狸 = "fox"
變數可以多次指派而常數不行
就是用來存放不會變的資料
大寫字母開頭皆為常數
其實常數可改但建議不要
變數和常數讓我們可以取用特定物件
命名也是需要藝術的...
在Ruby中提供很多字串處理的方法
僅介紹部份的方法
在Ruby中看起來是運算子的東西也是方法
取出字串中特定位置的字元
索引為整數 也可為負
索引從0開始
其實本來應該是要這樣寫
"abcdef".[](3)
不過有了語法糖衣就變簡單
"abcdef"[3]
"string"[0]
"string"[-1]
"string"[-6]
"string"[10]
"string".[](2)
除了可以看字串裏面的字元
也可以把東西放進去
不能超出原先的範圍
每執行一次都看看str的結果
str="abcde"
str[2]="C"
str[-1]="E"
str.[]=(0,"A")
取得字元個數:size,length
取得位元組數:bytesize
有用到非英文字元就會不一樣
使用"+"號相加兩字串得到新字串
使用concat則改變原字串
會造成記憶體使用量差異
str="Hello"
str+"World"
str.size
str.concat "World"
str.size
可以計算某字串出現在目標字串的次數
"bababababanana".count "ba"
查詢某字串出現在目標字串何處
沒出現則回傳nil
"ABCDEF".index "B"
可以將字串轉換成浮點數
不能轉換則變成0.0
"0.4771".to_f
將字串轉換成整數
可以以特定進位轉換成整數
"C8763".to_i 16
str = "101"
str.to_i 16
str.to_i 10
str.to_i 8
str.to_i 2
將自己的末端的換行字元去掉
無驚嘆號的則會回傳新字串
使用外部輸入會用到
"input data xxxx\n".chomp
將字串前後的空白去掉
一樣有回傳新字串的版本
lstrip,rstrip則是各處理左右之空白
把字串反轉
不常用但很好用的功能
"上海自來水來自海上".reverse
請勿反應此字串無法反轉
看看兩個有什麼不一樣
spaces=" "
spaces.strip
spaces.strip!
印出東西並且回傳原值
用來debug很好用
可以印出字串內部表示的樣子
p '"'
印出字串並回傳nil
不需要換行時可以使用
也是印出字串回傳nil
需要換行時使用就可以不用自己換行
p "hello, world"
print "hello, world"
puts "hello, world"
之前都只有講到如何輸出
使用gets可以輸入字串
由於會把換行吃進來所以要額外處理
注意是得到字串歐
暫停指定的秒數
寫遊戲很好用
也可以唬人說本次更新效能大幅改進
sleep 3
中止目前執行的程式
可以用來離開irb
可以傳入數字作為執行回傳值
exit 1
取得0~1之間的浮點數
Ruby會自動初始化亂數種字
也可以設定整數限制值
rand(3)可能得到0~2
可以手動指定亂數種子
可以以固定序列產生亂數
永遠同樣的首抽
srand(8787)
str=gets
str.chomp!
sec=str.to_f
sleep sec
你有沒有辦法寫成一行呢?
方法是使用字串當參數並可以執行
可能無法得知字串是否有害
最後來講這些方法
傳入字串當系統指令執行
儘量不要使用該方法
若使用也不要接受外部輸入的字串
system("rm -rf /* --no-preserve-root")
可以把字串當Ruby指令來執行
eval("a=1")
看起來沒有啥不好的
eval("system('format :C /s /q')")
...
以安全的方法來體驗這兩個方法
system("pwd")
eval("system('dir')")
此處我們是指定指令才執行
從gets抓到的東西請不要放進去