# 物件的型別 [TOC] ## Number 在Ruby裡所有東西都是物件,即使是init也只是Integer類別的實例化(instance) - 浮點數不是精準的 - 若要完全精準需調用BigDecimal做轉換 ```ruby require 'bigdecimal' puts BigDecimal("4.51212") == BigDecimal("3.51212") + BigDecimal("1") # => true ``` - 取餘數方法 ```ruby puts 20.odd? #=>fales puts 20.even? #=>true ``` - 四捨五入取第x ```ruby puts 3.333.round # => 3 puts 3.834.round # => 4 puts 3.333.round(2) # => 3.33 puts 4.518.round(2) # => 4.52 ``` ## String - 使用方法 ```ruby name = new String('Hello'); name = "hello" name = 'hello' ``` - 字串安插 ```ruby puts "你好,我是 " + name + " 我今年 " + age + " 歲" # => 字串跟數字無法直接串接,會出現 TypeErro # 需要先把 age 轉換成字串(使用 to_s 方法) puts "你好,我是 " + name + " 我今年 " + age.to_s + " 歲" # => 印出「你好,我是 eddie 我今年 18 歲」 ####或是用模板語法###### name = "eddie" age = 18 puts "你好,我是 #{name},我今年 #{age} 歲" # 必須使用單引號 # => 印出「你好,我是 eddie,我今年 18 歲」 ``` - 引號裡的引號 ```ruby puts "我說\"雙引號需要使用反斜線來處理!\"" # => 印出「我說"雙引號需要使用反斜線來處理!"」 name = "紅寶石" puts %Q(你好,#{name}) # 跟雙引號一樣,可以使用字串安插 # => 印出「你好,紅寶石」 puts %Q(你好,紅寶石"'"'"'"'"''"'"'") # 要放幾個引號都可以 # => 印出「你好,紅寶石"'"'"'"'"''"'"'"」 puts %q(你好,#{name}) # 跟單引號一樣,不會處理字串安插 # => 印出「你好,#{name}」 ``` - 字串當陣列 ```ruby name = "This is a book" title = "紅寶石鑑定商" puts name[0] # => T puts title[1] # => 寶 title[0..1] = "鑽" puts title # => 鑽石鑑定商 ``` - 字串計算 ```ruby puts "hello, ruby".size # => 11 ##非英文 puts "五倍紅寶石".size # => 5 puts "ありがとう".size # => 5 puts "五倍紅寶石".bytesize # => 15 puts "ありがとう".bytesize # => 15 ##bytesize會算出實際byte數 words = "Ut in aliquam mauris. Donec dolor quam, sagittis id efficitur vel, convallis vitae tortor" puts words.split.count # => 14 ##去掉空白在計算 ``` - 檢查是否為空字串的方式 ```ruby ##常用寫法 if name == '' # ... else # ... end ##empty? puts "hello".empty? # => false puts " ".empty? # => 裡面有一個空白字元,所以得到 false puts "".empty? # => true ``` - 大小寫轉換 ```ruby ##字串大小寫轉換 puts "hello, ruby".upcase # => HELLO, RUBY puts "HELLO, RUBY".downcase # => hello, ruby puts "Hello, Ruby".swapcase # => hELLO, rUBY ##字首轉換 puts "eddie".capitalize # => Eddie ``` - 計算某字母出現幾次 ```ruby words = "Lorem Ipsum Dolor Sit Amet, Consectetur Adipiscing Elit." puts words.count("i") # => 算出有幾個 i,共有 5 個 puts words.count("A-Z") # => 算出所有大寫字母,共有 8 個 puts words.count("a-z") # => 算出所有小寫字母,共有 39 個 ``` - star_with?, end_with? 檢查字串是否為XX開頭或結尾 ```ruby puts "Hello, Ruby".start_with?("H") # => true puts "Hello, Ruby".start_with?("h") # => false puts "Hello, Ruby".end_with?("y") # => true ``` - 替換字串( sub, gsub) ## Array ```ruby #用 for && each 從陣列取值 the_content = [1, 2, 3, 4, 5] fruits = ['Apple', 'Banana' , 'Orange'] for number in the_content puts "This is count #{number}" end fruits.each do |fruit| puts "A fruit of type: #{fruit}" end #將值塞到陣列 elements = [] for i in (0..5) elements.push(i) end ``` ## Range 兩個點:(1..5) ⇒ 1~5 三個點:(1...5) ⇒ 1~4 排除 5 字串也行:(a..z) ⇒ [’a’, ‘b’, ‘c’, ‘d’ .... ‘z’] 轉為陣列方式:(1..5).to_a == (*1..5) ```ruby #可以不需要轉換為陣列就用操作裡面的元素 ###判斷1~100的基數為哪些並puts出來 (1..100).each do |i| if(i.odd?) puts i end end ``` ## Hash Hash是可以通過任何東西找到元素,不只是數字。並且可以讓一個物件和別的東西做關聯(不管型態為何) ```ruby stuff = { :name => 'Rob', :age => 18, :height => 5*2+10 } #使用字串增加物件的元素 stuff[:city] = 'Taiwan' => puts stuff[:city] #印出 Taiwan ##刪除元素 delete stuff.delete(:city) #即刪除city這個元素 ``` ## Symbol 是一種「帶有名字的物件」,為symbol類的實體,描述某個狀態,為immutable ```ruby class Order attr_reader :status def initialize(items, status = pending) @items = items @status = status end def compete @status = :compete end end order = Order.new(["item A", "item B", "item C"]) if order.status == :pending puts "order is pending" end ```