---
# System prepended metadata

title: 物件的型別

---


# 物件的型別
[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
```
