# 3/19 - Ruby
## 兩種貼紙:變數&常數
### 變數 Variable
要有意義的命名
變數本身沒有型態,但被指到的會有
### 常數 Constants
只要是大寫開頭的就是常數,不需特別定義
其他程式語言不能改常數,但Ruby可以
### 等號=的右手邊,是要運算的東西,就會丟回左邊的標籤
```
Cx = 1
Cx = 2
puts Cx
Ans: 2
```
常數不能重新指向新的陣列,但可以改裡面的內容
```
Cx = [1,2,3]
Cx = [3,3,3]
上面不會成立
Cx = [1,2,3]
Cx[0] = "a"
p Cx
Ans: ["a",2,3]
```
```
a = 1 // a 指向 1
b = a // b 指向 a (也等於指向1)
```
```
a = a + 1
等同於
a += 1 (蠻多工程師這麼寫)
```
```
#a = truth / false
a = a || 1 // or
puts a
Ans: 1
```
如果 or 前面的是假的,就會印出後面的東西,即便是假的。
Ruby世界中,只有 nil & false 都是假的
---
### 變數命名方法
Ruby中,用蛇式為多
snake case: my_room
kebab case: my-room
---
### 關鍵字保留
系統的內建字 if, while
---
### 單引號 雙引號
單引號不會翻譯
---
### 等號
一個等號。指定 =
兩個等號。比較 ==
(三個也是比較)
### 倒裝句
```
weather = "rain"
if weather == "rain"
puts "stay home"
end
\\ 上下的公式相同 //
puts "stay home" if weather == "rain"
```
三元運算子:短程式碼
(先求有,之後再看要不要學)
---
### 符號 Symbol
簡單,但不容易說明。
```
x = 1
label value
:a 前面有一個冒號
```
# Ruby中,每個物件都會有ID,而且每個物件印出都會不一樣;
不過符號的卻一樣
# .object_id // 有一個固定的公式
```
{name: 'kk', age:18}
上下的公式相同
{:name=>"kk", :age=>18}
a[:name]
Ans: "kk"
```
---
### 方法 method/ 函數 function(JS)
#### def
```
def pi
return 3.14
end
```
#### 寫函數、寫方法的目的,是要讓上面的 方法 有意義/起名
method : 操作物件
```
def say_hello_to(name) #參數 出現在定義的時候
puts "hello, #{name}" #帶入引數的值
end
say_hello_to('kitty') #引數 arguments
say_hello_to('nancy')
```
### 區域變數
若同名,呼叫出《變數》的優先權大於《方法》
( )可看情況適合省略,不過括號是 明顯的呼叫方法
---
### return : 回傳,交回控制權,強制中斷方法往下進行
```
return // 把控制權 還給 原來呼叫的人
return 1 // 歸還控制權,並送一個 1 回傳值 回去,前提是呼叫的人有 puts
```
### 在Ruby中,return可以適時省略
### (如放在最後一行,或是唯一的一行,就會是return)
### ***方法中的最後一行,如果沒有特別指定,預設會是 return* **
```
def age
1
2
20 // 這裡會預設放 return
end
puts age
Ans: 20
```
false 是一個存在的值,所以不需要透過p,就可印出來;
nil 就需要透過 p 印出來。
puts 只是印出方法,沒有回傳值
p 的回傳值就是印出來的東西
p 可印出完整個框架,含回傳值(nil也會印出來)

上面會印出 10 , 20
---
```
def user_list
return [ 'a', 'b', 'c']
end
x,y,z = user_list
Ans:
"a"
"b"
"c"
```