iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Modern Web

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

[ Day 09 ] Ruby 充滿了符號

  • 分享至 

  • xImage
  •  

最近在使用 Rails 做專案時,時常寫到長這樣的程式碼:

class CommentsController < ApplicationController 
  before_action :find_article, only: [:create]

def find_article
  @article = Article.find(params[:article_id])
end
    
==========
        
class BlogVisitor < ApplicationRecord
  belongs_to :user
  belongs_to :blog
end

def user_params
  params.require(:user).permit(:email, :password, :password_confirmation)
end

起初會以為是不是冒號加錯地方,但是改成before_action: find_article程式直接 Boom!!! 直接壞給你看。

所以:find_article:user:email是什麼呢?

所以 Symbol 是什麼?

這個符號大家應該都知道是什麼吧!
沒錯!就是大名鼎鼎的蘋果公司,但是誰告訴你這就是蘋果公司了。
他就只是一個符號,代表著蘋果公司。

以此類推:
你看到一隻狗,你會說牠是一隻狗,看到一隻貓會說牠是一隻貓。
cat dog

但動物呢?牠是什麼?
因為不能明確的指出動物是什麼,我們只能說動物就是一種所有類別的集合。

看到這邊,你一定會想問:講這麼多,所以符號到底是什麼東西啦!
簡單來說,它只不過是"帶有名字的物件"。

還記得 Ruby 是物件導向的程式語言嗎?
所以1 是一個數字物件、"a" 是一個字串物件、:hello 一個符號物件。

p :hello.class    # => Symbol 名叫hello的物件
p 2.class         # => Integer 名叫2的物件

所以符號就只是一個帶有名字的物件

Symbol vs Variable

這兩者有什麼差別呢?
首先,變數是一個指向某個物件的名字。

character = "Mario"

上面的語法經過翻譯蒟蒻,是指character變數指向Mario這個字串物件。如果我將Mario拿掉,那character變數就沒辨法存活下來了,因為沒有東西可以讓他指了,它就變得一點用都沒有。

而Symbol本身就是一個帶有名字的物件,所以不用指向任何東西就可以使用了。
如果你把Symbol當作變數在用,那麼它就會噴你滿臉灰。

:state = "Error!"    # => syntax error

你可以這樣寫:

character = :character

這樣的概念就像是 a = 1
當某天有人跟你說,符號跟變數的是一樣的?
你可以回答他:符號不是變數,它就只是一個值或者是一個物件。

Symbol vs Srting

這兩個的差異在於字串的內容是可以變,但Symbol不行。
先以字串來說:

greeting = "How are you"
greeting[0] = "W"
p greeting    # => "Wow are you"

我可以很輕鬆的改掉字串中的字。
那換成Symbol呢?

greeting = :Hello
greeting[0] = "W"
p greeting    # => NoMethodError

會出現錯誤訊息是因為,Symbol沒有 []= 這個方法

其他像是lengthupcasedowncase等,這些跟字串長很像的方法都可以使用。

p :kitty.length    # => 5
p :kitty.upcase    # => :KITTY

甚至你可以取得字元

p :kitty[4]    # => "y" 

這邊要再次提醒各位,字串可以被修改,但Symbol不能被修改。

這裡幫大家重點整理一下

Symbol Srting
可變 No Yes
修改 No Yes
取得字元 Yes Yes

下個單元將會介紹關於一些Symbol小秘密以及使用的時機。

參考文章:
1.為你自己學 Ruby on Rails


上一篇
[ Day 08 ] Ruby 第一次聽到雜湊以為是吃的
下一篇
[ Day 10 ] Ruby 關於符號的一些事
系列文
Ruby新手村的礦工日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言