# Ruby 語法整理
### 浮點數
puts 3.55.round #轉成整數 四捨五入
puts 3.55.floor #轉成整數 無條件捨去
puts 3.55.ceil #轉成整數 無條件進位
puts 3.55.to_i #轉成整數 無條件捨去
### IF
```ruby=
weather="下雨"
if weather=="下雨"
puts="宅在家裡"
end
```
(倒裝寫法)
```ruby=
puts "宅在家裡" if weather=="下雨"
```
### if else 二分法
```ruby=
age=19
if age>=18
status="成年"
else
status="未成年"
end
```
或使用三元運算子
```ruby=
status=(age>=18) ?("已成年"):("未成年")
```
### if...elsif...else
```ruby=
weather="太陽"
if weather=="太陽"
puts "出去玩!!!"
elsif weather=="下雨"
puts "宅在家裡!!!"
else
puts "睡覺"
end
```
### case...then
```ruby=
weather="下雨"
case weather
when "下雨"
puts "宅在家裡!!!"
when "太陽"
puts "出去玩!!!"
else
puts "睡覺"
end
```
### while迴圈
```ruby=
x=0
while x<10
puts x
x+=1
end
```
### loop迴圈
```ruby=
i=0
loop do
puts i
i+=1
break if i>10
end
```
### method式迴圈
```ruby=
5.times do
puts i
end
```
```ruby=
1.upto(10) do |i|
puts "hello ruby #{i} "
end
```
```ruby=
10.downto(1) do |i|
puts "hello ruby #{i} "
end
```
### 迭代式迴圈
```ruby=
names = ["eddie", "joanne", "john", "sherly"]
names.each do |name|
puts name
end
```
#### 在名前列出索引值外鄉人寫法
```ruby=
names = ["eddie", "joanne", "john", "sherly"]
x = 0
names.each do |name|
puts "#{x} #{name}"
x += 1
end
```
### 內行人使用.with_index
```ruby=
names = ["eddie", "joanne", "john", "sherly"]
names.each.with_index do |name,x|
puts "#{x} #{name}"
end
#.with_index 給陣列加上序號
```
### 建立陣列
使用Array或是[中括號]的類別建立
a=array.new
b=[]
```ruby=
list = %w(ruby php python)
p list # 印出 ["ruby", "php", "python"]
```
%w = 中括號裡面的內容會視為字串
#### 使用陣列
```ruby=
heroes = ['孫悟空', '魯夫', '宇智波佐助', '一拳超人', '流川楓', '黑崎一護', '劍心'];
puts heroes[0] # 印出 孫悟空
puts heroes[1] # 印出 魯夫
puts heroes[-1] # 印出 劍心
puts heroes[-2] # 印出 黑崎一護
```
陣列都由0開始計算,由前呼叫陣列輸入[0] 若由後往前的話輸入負數即可
### Ruby特有寫法-使用First、last
*(在rails裡才有second的用法)
```ruby=
heroes = ['孫悟空', '魯夫', '宇智波佐助', '一拳超人', '流川楓', '黑崎一護', '劍心'];
puts heroes.first # 印出 孫悟空
puts heroes.last # 印出 劍心
```
### .length 知道陣列長度
```ruby=
heroes = ['孫悟空', '魯夫', '宇智波佐助', '一拳超人', '流川楓', '黑崎一護', '劍心'];
puts heroes.length #印出7
```
### .push or << 在最後面增加陣列人數
```ruby=
heroes = ['孫悟空', '魯夫', '宇智波佐助', '一拳超人', '流川楓', '黑崎一護', '劍心'];
heroes << '鳴人'
或是
heroes.push ('布羅利')
```
### map(等同於collect)用法
對集合裡的每一個元素進行計算,並收集成一個新的集合
```ruby=
list=[1,2,3,4,5]
p list.map {|x| x*2} #印出[2,4,6,8,10]
```
### select(等同於filter,反義為reject)用法
挑選集合裡符合條件的元素,並收集成一個新的集合
```ruby=
p (1..10).select {|x| x<5} #印出[1,2,3,4]
```
### reduce(等同於inject)用法
對集合裡的每個元素進行計算,並將所有計算歸納成單一結果
```ruby=
p (1..10).reduce { |sum , x| sum + x } #印出55
```
### compact用法
取消陣列裡的空集合(nil)
### sort用法
將陣列裡的元素由小至大排序
### uniq用法
將陣列裡重複的元素刪除
### Range標示
(0 . . 5) => 0~5的整數
(0 . . . 5) => 0~4的整數
('A' . . 'Z')=> A-Z
### shuffle用法
為將陣列打成亂數
### sample用法
直接將陣列裡的物件取樣出來
### 雜湊標示
a=hash.new
大括號 B={}
```ruby=
p profile = {name:'bb' , age= 18}
profile={:name=>'bb' , :age=>18 } #印出的結果
#因Hash有兩種寫法
#舊式hash寫法
1.profile = {:name=>'bb' , :age=>18 }
#ruby1.9版本後新式寫法(類似json)
2.profile = {name:'bb' , age= 18}
```
### keys&values用法
```ruby=
profile.keys #印出 [:name , :age]
profile.values #印出 ['bb' , 18]
```
### 其他方法
.to_a 表示轉型為陣列
.to_s 表示轉型為字串
.to_sym 表示轉型為符號
.object_id 回傳物件的識別編號
.sort 表示由小排至大
! 表示此程式碼須注意且會破壞原本的陣列型態
? 表示會回傳真假值回去
require 載入某個檔案並永遠只會載入一次(檔案可以省略.rb)
load 載入某個檔案且載入幾次就會執行幾次
yield 將控制權轉讓給Block
block_given? ruby內建方法,找尋block是否存在
Proc 使Block變成物件 Proc.new {|n| n+2}
lambda 同Proc後面不需寫.new
-> 同樣使block成為物件 參數放置前方 ->(n){n+2}
.call 呼叫Proc,帶入參數給Proc的物件
類別方法:在方法前面寫上self即可使用
.capitalize 使英文字母第一個字變大寫
.split() 根據某個字元將其拆開且成為字串
%05d % 20 = 使用此語法表示顯示5位數的數字,後面接數字會自動將前方的數字補零 印出 00020 的數字 (5可更改,d可以換成i一樣的意思)
%q 表單引號
%Q 表雙引號
%w 表中括號裡面的內容會視為字串