1. Ruby的物件導向

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

Ruby類別圖 (2)  

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

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

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

2. 物件類別

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

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

3. 型別的判斷

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

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?來判斷是否正好是某個類別:

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

4. 轉型

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

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

例如

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中沒有布林型別,但是仍可利用以下方法強制轉型成true或false:

puts !!false # false
puts !!nil # false
puts !!0 # true
puts !!"" # true
puts !!true # true

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

相关文章