iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Modern Web

Ruby新手村的礦工日記系列 第 3

[ Day 03 ] Ruby 中的變數好奇妙~

  • 分享至 

  • xImage
  •  

昨天你已經學會了怎麼使用 print、puts、p 來印出 Hello world 了,但這僅僅只是礦坑給你的小小見面禮。
今天要介紹在礦坑中常用的工具-變數,這也是我成為菜鳥礦工第一課!

什麼是變數?

變數是什麼?是會變身的數字?
還是一下子是10過一陣子又變成1的數字?

其實變數就只是一個標籤罷了,我們可以藉由變數來快速地取得我們所需要的東西。
舉個例子:
搬家時,有許多的東西需要分門別列的放進收箱中,並且在箱子外面貼上一個標籤,標示裡面的東西;下次拿東西時,可以藉由標籤快速取得我們需要的東西。

box = "Play Station 5"
puts box  # 印出 Play Station 5

而變數本身沒有型態,型態就像是字串、數字、布林值......等。

四大變數

在Ruby中,有四種變數,分別為以下四種:

區域變數 全域變數 實體變數 類別變數
命名方式 username $username @username @@username

區域變數 Local Variable

顧名思義就是生活於一個區域中的變數,而且開頭不用加任何東西。
例如:

name = "Tom"

def method_a
  name = "John"
  puts "Method_a: My name is #{name}."
end

def method_b
  name = 'Andy'
  puts "Method_b: My name is #{name}."
end

method_a
method_b
puts "Outside: My name is #{name}."

如果你現在看不懂defend沒關係,之後的章節會在講到這個,這邊你可以先把這兩個當作一個區域。
根據上面的說明,當呼叫了method_amethod_b方法以及印出一段文字。
那麼會印出什麼東西呢?
Method_a: My name is John.
Method_b: My name is Andy.
Outside: My name is Tom.

會出現這樣的結果,是因為區域變數的關係,當每個name變數離開了method_amethod_b,他就會消失了,而外面的name,因為沒有東西包住他,所以他會被下面的puts印出來。

全域變數 Global Variable

對全域變數來說,所有的地方都可以使用他,但是沒事不要隨便使用全域變數,這樣可能會造成接手你程式的人甚至你自己的困擾,尤其是Debug時。

$count = 0

class Test
  def count_1
    $count += 1
    puts "count_1: #{$count}"
  end
end

class Test2
  def count_2
    $count += 2
    puts "count_2: #{$count}"
  end
end

puts "count_0: #{$count}"
test = Test.new
test.count_1
test2 = Test2.new
test2.count_2

執行後的結果為:
count_0: 0
count_1: 1
count_2: 3

因為全域變數的關係,當執行class Test時,$count會 +1 並印出count_1: 1;此時的$count會變成$count = 1
所以當執行class Test2後,會變成1 + 2,所以會印出count_2: 3

全域變數竟然影響到其他的地方!除非這是你要的效果,不然不要隨便使用。

如果你有寫過其他的程式語言,你會發現好像少了些什麼。

為什麼不用宣告變數!!!

在Ruby的世界中,使用變數是不用是先宣告或是指定型態,直接用就可以了。
是不是覺得他很方便啊!
在變數命名規則上,一般來說組成會使用英文字母、數字或底線。或是非英文字母也可以,例如:

book_title = "菜鳥礦工的生存日記"
power = 100
工具 = "十字鎬"

實體變數與區域變數,在後面的章節會提到,所以請大家不要緊張,我們明天見!

參考資料:

  1. 為你自己學 Ruby on Rails

上一篇
[ Day 02 ] 請問要來點 Hello World 嗎?
下一篇
[ Day 04 ] Ruby 要怎麼使用字串?
系列文
Ruby新手村的礦工日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言