---
title: AstroCamp Ruby 190722
description: 整理筆記
robots: noindex, nofollow
lang: zh-tw
dir: ltr
breaks: true
tags: Ruby
disqus: hackmd
---
{%hackmd BkVfcTxlQ %}
###### 20190722 tags: `Ruby`
# ==Numeric(數字)==
```=Ruby
puts 3.55.round #四捨五入
puts 3.55.floor #無條件捨去
puts 3.55.ceil #無條件進位
puts 3.55.to_i #轉整數
```
==一些在運算上會出現意料之外的結果的運算==
```=Ruby
(0.3 / 0.1).floor #=> 2 (!)
(2.1 / 0.7).ceil #=> 4 (!)
(0.3 / 0.1).to_i #=> 2 (!)
```
## 整數的除法
```=Ruby
puts 3/2
puts 3/2.0
puts 3.0/2
```
### ==數字也是物件==
## 範圍
```=ruby
(1..10).to_a
(1...10).to_a #少用
('a'..'z')
```
Q:計算1到100的總和
```=ruby
total = 0
(1..100).to_a.each do |x|
total = total + x
end
puts total
```
better way
```=ruby
p (1..100).to_a.sum
```
```=ruby
p (1..100).reduce { |sum, x| sum + x }
```
# [Array](https://apidock.com/ruby/Array/)
## 為什麼要使用陣列?
跑迴圈或是同時傳入大量參數時。
>Ruby 陣列的特色:
>允許同時存放不同的資料型態
---
產生陣列的方法
```
list = %w(kk mm bb)
```
使用陣列
```=ruby
heroes = ['孫悟空', '魯魯夫', '宇智波佐助', '⼀拳超人', '流川楓','黑崎⼀護', '劍心'];
puts heroes[0] # 印出 孫悟空
puts heroes[1] # 印出 魯魯
puts heroes[-1] # 印出 劍⼼
puts heroes[-2] # 印出 ⿊黑崎一護
puts heroes.first # 印出 孫悟空
puts heroes.last # 印出 劍⼼
puts heroes.second # 印出 nothing
puts heroes.length # 印出 7
heroes << '漩渦鳴⼈人' # 印出 8
heroes.push('布羅利')
puts heroes.length # 印出 9
```
---
### ==針對陣列常用的方法:==
## ==map==
>對陣列內元素做同樣的處理後,產生新的陣列。 [name=邱宏毅]
```=ruby
list = [1, 2, 3, 4, 5]
new_list = []
list.each do |x|
new_list << x * 2
end
p new_list
p list.map { |x| x * 2 }
# list不寫的話
p (1..5).map { |x| x * 2 }
```
## ==select==
>挑選符合條件的元素並成為新的集合 [name=Patrick Liu]
```ruby
p (1..10).select { |x| x < 5} #取1234
p (1..10).select { |x| x % 2 == 0} #取偶數
```
Q.選出奇數
```=ruby
p (1..10).select { |x| x % 2 == 1} #取奇數
p (1..10).select {|x| x % 2 != 0 }
p (1..10).select {|x| x.odd? }
#外鄉人的寫法
new_list = []
(1..10).each do |x|
if x%2 == 1
new_list << x
end
end
p new_list
```
## ==reduce==
對各元素運算歸納成一個結果
```=ruby
p (1..100).reduce {|sum, x| sum + x}
```
---
# ==[Hash](ruby-doc.org/core-2.5.1/Hash.html)==
What is Hash?
Key 和 Value 的組合
```=ruby
profile = {name: 'kk', age: 18} #新式寫法
p profile
#profile = {:name => "kk", :age => 18} #舊式寫法
```
Q. a = [1, 2, 3,1,2,1,3,1,2,3,4,5,6]
```=ruby
b = Hash.new()
p b["nothing"]
c = Hash.new(12)
p c["nothing"]
a = [1, 2, 3,1,2,1,3,1,2,3,4,5,6]
num = Hash.new(0)
a.each do |x|
num[x]= num[x] + 1
end
p num
#nil
#12
#{1=>4, 2=>3, 3=>3, 4=>1, 5=>1, 6=>1}
```
# [Symbol](ruby-doc.org/core-2.5.1/Symbol.html)
>符號:有名字的物件(==是一個值,不是變數==)
>具有唯一性的特徵,所以不能修改。[name=邱宏毅][color=#00cc00]
```
1 數字物件
"aa" 字串物件
:hello 符號物件
```
```
#irb
age =18
age.class => Integer
:age.class => Symbol
```
### ==字串的內容可以改變,符號不行==
```=ruby
p "hello".object_id #70143757662660
p "hello".object_id #70143757662560
p "hello".object_id #70143757662460
p :hello.object_id #1057308
p :hello.object_id #1057308
p :hello.object_id #1057308
```
### 字串轉符號
```=ruby
p "name".to_sym # 印出 :name
p :name.to_s # 印出 "name"
```
### ==字串與符號的使用時機==
不可變時,優先使用符號。
[Duck Typing](https://zh.wikipedia.org/zh-tw/%E9%B8%AD%E5%AD%90%E7%B1%BB%E5%9E%8B)
>Q.常數,變數和符號的差別?(開放作答)
>>常數跟變數在Ruby裡沒有差別,只差在==命名方式不同==
>>變數可以給值,符號本身就是一個值 [name=唐睿聰]
### ==return 回傳值==
>回傳 = 交回控制權[name=邱宏毅][color=#00cc00]
```
#控制權的交換
def method_name #控制權2
return ... #控制權3
end
method_name() #控制權1 ##控制權4
```
>puts 本身沒有回傳值(=> nil)
>p 卻有回傳值
>return 可適時省略,會自動回傳最後一行的執行結果
### ==問號與驚嘆號==
可以是命名的一部份 但只能放在最後面
>問號通常會回傳真假值
>驚嘆號通常表示要注意!
>>method_name! 預期回傳True/False
>>method_name? 有副作用[color=#00cc00]
```=ruby
def is_adult?(age)
if age >= 18
return true
else
return false
end
end
p is_adult?(20) #true
或是
def is_adult?(age)
age >= 18
end
p is_adult?(20) #true
```
Q. 函數(function)跟方法(method)有什麼不同?
>function沒有對象 method有對象
>>method有作用對象(物件導向的設計)
>>[color=#00cc00]
>>
## ==模組化==
有個 main.rb 專門require或load 其他rb檔案
>方便分工
>require只會載入一次 load每次執行就載入一次
# ==Block==
>無法單純存活 必須依附在method之後
>>只是一個程式碼區塊[color=#00cc00]
```=ruby
#do..end 與 { } 兩種寫法
5.times { |i|
puts i
}
5.times do |i|
puts i
end
```
Q. { } 與 do..end 的差別?!
```=ruby
list = [1,2,3,4,5]
p list.map{ |x| x*2 }
p list.map do |x| x*2 end
###
[2, 4, 6, 8, 10]
#<Enumerator: [1, 2, 3, 4, 5]:map>
```
但有 yield,block會強致執行一次
```=ruby
def say_hello
puts "hi"
end
say_hello {
puts "here"
}
puts "there" #hi there
def say_hello
puts "hi1"
yield
puts "hi2"
end
say_hello {
puts "here"
}
puts "there" #hi1 here hi2 there
```
# ==[Code Examples](https://repl.it/@Chris_Chiu/breed-crumbs)==