iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 5
1

變數 Variable

Ruby變數分成區域變數local Variable、全域變數global Variable、實例變數instance Variable、被類別變數class Variable四種

種類 變數 預設值 說明
區域變數(local Variable) cat 非大寫字母開頭
實例變數(instance Variable) $cat nil $ 符號開頭
類別變數(class Variable) @cat nil @ 符號開頭
全域變數(global Variable) @@cat @@ 符號開頭

變數得預設值

進入irb來看,可以得知在還沒有初始化的全域變數以及實體變數預設值是 nil,則區域變數再沒有指定值的狀態下會跟你說找不到:

> $cat		# => nil
> @cat		# => nil
> cat		# => Error : undefined local variable or method `cat' for main:Object
> @@cat		# => Error : uninitialized class variable @@cat in Object

區域變數(local Variable)

區域性變數以非大寫字母為開頭開頭。有效範圍從class、module、def或do end {},但如果超過指定的範圍,就會找不到了。

def method
  local = "abc"
  puts local  # abc 區域變數,在方法內可取得值
  
  @instance = "xyz"
end
method
puts local  # 定義方法外會出現error:undefined local variable or method

實例變數(instance Variable)

實例變數以@符號開頭,在類別中,可以讓所以的方法共用得變數,且變數的值會根據各個方法而儲存不同的值,實體變數在class互相取值前記得要先將物件實體化之後才能互相使用。

類別變數(class Variable)

類別變數@@符號開頭,類別變數與實例變數得差異就在繼承,由於類別變數除了在自己的class,因為繼承也可以直接在其他得class使用,為了避免日後專案出錯,通常是建議最好不要去使用它。

class Animal
  @@cat = :a
  @dog = :b

  def self.cat
    @@cat
  end

  def self.dog
    @dog
  end
end

class Zoo < Animal
end

p Animal.dog # :b
p Zoo.dog # nil
p Animal.cat # :a 
p Zoo.cat # :a

全域變數(global Variable)

全域變數$開頭,在尚未初始化前全域變數的預設值為nil。顧名思義全域變數能夠編寫於任何地方,在使用上相對危險。

虛擬變數(pseudo variable)

除了以上四種變數外,還有Ruby本身自己定義的變數,稱為虛擬變數,例如 nil, self, true, false,這些虛擬變數都有特別用途或意義,所以內容是不能被更改的。

> true = 0	# => Error : Can't assign to true
> self = 0  # => Error : Can't change the value of self

常數 Constant

使用方式跟變數差不多,但Ruby對常數有特別的命名規定就是大寫英文字母開頭,就像所有的類別、模組的名字都必須是常數大寫字母開頭。

  Cat = 123
  Dog = "Meeks"
  MyName = "Aimee"    #=> Aimee
  MyName << "Lo"      #=> AimeeLo

而且在Ruby程式語言裡,常數的內容是可以修改,即便有跳出警告訊息,但還是可以正常使用。

> MyName = "Amy"
 => "Amy"
> MyName = "Aimee"
     warning: already initialized constant MyName
     warning: previous definition of MyName was here # 出現警告
 => "Aimee"
> MyName
 => "Aimee" # 依然可以更改

參考連結:
變數、常數、流程控制、迴圈
「Ruby筆記06」實例變數・類別變數・類別實例變數的差異與用法
[Ruby] 變數(variable)與常數(Constant)


上一篇
Day 04 | Gem與Bundler
下一篇
Day06 | 轉轉轉迴圈與迭代
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30

尚未有邦友留言

立即登入留言