---
# System prepended metadata

title: Ruby 語法整理

---

# 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 表中括號裡面的內容會視為字串