iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
1
自我挑戰組

關於 Ruby on Rails 的那些事系列 第 3

Day 3 - 資料型態介紹:String & Symbol

String 字串

字串和數字是程式語言中最常使用到的資料型態。而在Ruby語言中,數字這個型態本身沒有疑問,但很多人會搞混字串與符號,甚至是不懂兩者的區別。
所以先來介紹這兩個資料型態,爾後再說說兩者使用的方式及適合的地方。

單引號雙引號%q()%Q()

以上4種方式可以表達資料型態為字串,符號內的文字即是字符串的值。

name = 'mei'
gender = "female"
school = %q(台灣大學)
department = %Q(資工系)

在字串內容中使用引號會發生什麼事?

如果在使用字串時,剛剛好把定義型態用的引號和文字串中的引號使用一樣的符號時,電腦會不知道究竟哪邊是定義字串而使用的引號?哪邊是文字串中使用的引號?當遇上這種情況,電腦會將最近的兩個符號視為一組,那後面的文字排出在外,就會發生錯誤,來看看例子:

  • 錯誤寫法
puts 'I'am a programmer.'

執行後出現錯誤訊息:「syntax error, unexpected tIDENTIFIER, expecting end-of-input」
可以看到程式自動把「'I'」視為字串的範圍,後面的am a programmer.被排除在外

  • 正確寫法
    可以使用\來跳脫字元,避免電腦看不懂字串起始位置在哪裡,告訴電腦這邊是內容會用到的引號!
puts "I'am a programmer."
puts "I'am a programmer."
puts 'I\'am a programmer.'
puts %q(I'am a programmer.')
# 以上4種寫法的執行結果都是 I'am a programmer.

一句話中常常會有字串及數字

若要顯示的一段文字包含字串及數字型態的變數:

subject = '國文'
score = 98
  • 使用+來連接,但數字和字串無法串接,須先把數字轉型為字串 to_s
puts "我的" +subject+ "成績是" + score.to_s + "分"
# 執行結果 我的國文成績是98分
  • 還可以用雙引號%Q做字串安插:
    這樣的寫法很方便之外,看起來也比較清楚 (code 也短了很多,哈哈)
puts "我的#{subject}成績是#{score}分"
puts %Q(我的#{subject}成績是#{score}分)
# 以上的執行結果皆為 我的國文成績是98分
  • 要注意的是無法使用單引號%q做字串安插,這樣的寫法電腦只會視為字串
puts '我的#{subject}成績是#{score}分'
puts %q(我的#{subject}成績是#{score}分)
# 執行結果為 我的#{subject}成績是#{score}分

修改string,其實可以把字串當陣列來偷偷修改內容

content = "我們是Ruby工程師"
content[0..1] = 我

puts content

# 執行結果
# 我是Ruby工程師

( Ruby 的陣列取值,第一個值的索引為0喔!)

Symbol 符號

命名規則與一般變數差不多,數字、英文、日文等皆可以使用:

:姓名
:name
:なまえ

可以想成「帶有名字的物件」,但string可以修改,symbol不行:

上述提到string可以當成陣列來玩,以便修改內容,但是符號並沒有這樣的特性!

  • 正確寫法
name = :kitty
gender = "female"
two = 2
p gender
p name
p two

# 執行結果
# "female"
# :name
# 2
  • 錯誤寫法:就像把數字指定為字串
2 = "kitty"
:name = "kitty"
p 2
p :name

執行後出現錯誤訊息:「syntax error, unexpected '=', expecting end-of-input」
2本身就是數字,不能當變數使用,故symbol也同樣道理

應用:存放某個東西的狀態,例如使用者權限

下面的authority有3種狀態:admin:manager:member
可以用符號來表示使用者擁有的權限為哪種狀態。

class User
  attr_reader :authority
  
  def initialize(username, authority= :member)
      @username = username
      @authority = authority
  end
  
  def admin
      @authority = :admin
  end

  def manager
      @authority = :manager
  end
  def member
      @authority = :member
  end
end

user = User.new(["kitty", "mei", "jill"])
  
if user.authority == :member
  puts "user's authority is member."
end

Symbol主要用作:

1. hash的key

author = { name: "eddie", book: "為你自己學" }
author = { :name => "eddie", :book => "為你自己學" }

2. 指向mothod的名稱

class AbcController
    def edit
        # Do something
    end

    def update
        if @data.save
            redirect to ...
        else
            render :edit
        end
    end
end

等說完hash是什麼之後,就來比較一下string和symbol的差異,與為什麼hash用符號比字串來得適合...

參考資料:
為你自己學Ruby on Rails-高見龍
Ruby - Strings

學無止盡,每天都要進步一點點!


上一篇
Day 2 - 名字的重要性「變數」與「常數」
下一篇
Day 4 - 資料型態介紹:Array & Hash
系列文
關於 Ruby on Rails 的那些事30

尚未有邦友留言

立即登入留言