Ruby 的物件導向

由於 Ruby 是個完全物件導向的語言,它不像其他語言使用原始型別 (primitive types),例如 int, bool 之類的型別,所有的實字 (literal) 都會被解析成對應的物件來使用。
Ruby 類別圖

從上圖可以看到物件的階層關係,所有型別皆繼承自物件 (Object),甚至是模組 (Module) 和類別 (Class)。

之後幾篇文章將逐一介紹一些主要的型別,包含以下項目:

  • 字串(String)
  • 符號(Symbol)
  • 數字(Numeric)
    • 整數(Integer)
    • 浮點數(Float)
  • 陣列(Array)
  • Hash
  • 範圍(Range)
  • Nil
  • True
  • False

物件類別

所有型別都是物件,可以利用 class 的屬性來查看物件型別:

1
2
3
4
5
6
7
8
9
10
11
puts "Hello".class              # String
puts :Hello.class # Symbol
puts 1.class # Fixnum
puts 9999999999999999999.class # Bignum
puts 1.1.class # Float
puts [].class # Array
puts ({"key" => "value"}).class # Hash
puts (1..5).class # Range
puts true.class # TrueClass
puts false.class # FalseClass
puts nil.class # NilClass

型別的判斷

Ruby 提供 is_a?kind_of? 的函式來判斷是否屬於某種類別之下,功能是完全一樣的:

1
2
3
4
5
6
puts "Hello".is_a? String     # true
puts "Hello".kind_of? String # true
puts 1.is_a? Numeric # true
puts 1.is_a? Float # false
puts 1.1.is_a? Numeric # true
puts 1.1.is_a? Float # true

另外還有一個函式 instance_of? 來判斷是否正好是某個類別:

1
2
puts 1.1.instance_of? Numeric # false
puts 1.1.instance_of? Float # true

轉型

Ruby 中進行轉型是透過的物件提供的函式來達成,常見的有以下幾種:

  • to_s:轉成字串 (String)
  • to_i:轉成整數 (Integer)
  • to_f:轉成浮點數 (Float)
  • to_a:轉成陣列 (Array)
  • to_h:轉成 Hash

例如

1
2
3
4
5
p 1.1.to_s # "1.1"
p 1.1.to_i # 1
p 1.1.to_f # 1.1
p ({:key => :value}).to_a # [[:key, :value]]
p [[:key, :value]].to_h # {:key => :value}

並不是所有型別的可以互相轉換,視情況而定,另外一點特別的是,Ruby 中沒有布林型別,但是仍可利用以下方法強制轉型成 truefalse

1
2
3
4
5
puts !!false # false
puts !!nil # false
puts !!0 # true
puts !!"" # true
puts !!true # true

從上面的例子可以發現一個重要的事情:Ruby 中只有 falsenil 是判斷為 false

延伸閱讀

上一篇 Ruby 教學 - 基本語法 (Syntax)
下一篇 Ruby 教學 - Nil, True 和 False