ruby新手入门随手记 何谓:symbol?

还记得第一次用rails的时候被这火星文给震慑住

Rails.application.routes.draw do  resources :people #这是什么意思??? :写错位置了吧?end

一问才知道原来是symbol

那symbol是什么呢?

在ruby里面什么东西都是物件
而symbol也只是个有名字的物件
你可以把它看成不能修改的字串

symbol vs. string

其实symbol在宣告的时候就已经在记忆体里面佔有一席之地了!
然而string就像个无业游民,每次叫他就又在另一个记忆体位址

   p "hello".object_id   #47132441787720   p "hello".object_id   #47132441787480   p "hello".object_id   #47132441787400   p :hello.object_id    #1040988   p :hello.object_id    #1040988   p :hello.object_id    #1040988

上面的例子得知『在ruby每个字串都有不一样的记忆体位置』
而:hello就是给hello一个专属的记忆体位置

然而你也可以不透过symbol把"hello"存起来

   a = "hello"   p a.object_id  #47367933032220   p a.object_id  #47367933032220   p a.object_id  #47367933032220

会发现其实a透过『位址』去找值
就只是没有个物件把它存起来罢了

ruby的参数是透过『传址不传值』这规则去实践的

那怎么用symbol?

在用之前需要知道symbol有一个特性,那就是不能修改

    #你可以    p :hello.upcase    #:HELLO    p :HELLO.downcase  #:hello    p :hello.length    #5    p :hello[0]        #"h"    #不能够    p :hello[0] = "i"  #这样会喷错误讯息

symbol使用时机?

因为symbol不能修改的特性
往往会应用在不用去修改的资料上(废话
在hash的key就很常看到symbol的出现

my_symbol = { :hello => "symbol", "hello" => "string"}p my_symbol[:hello]  # "symbol"p my_symbol["hello"] # "string" 

symbol与string间的转换

转换方法有分为这几种

    #字串转symbol    p "name".to_sym   <=常用    p "name".intern       #symbol转字串    p :name.to_s      <=常用    p :name.id2name

範围技转symbol

在ruby有个指令叫冰冻字串

    #frozen_string_literal: true #没错,连#也要给他打下去    s = "abc"    s[0] = "x"     #会出错    p s  

#frozen_string_literal: true
可以把整个程式码都冰冻住,不得修改
让程式可以跑快一点 (现在的我也感觉不出来快多少 XD

有範围技当然就有指定技啰!

    s = "abc".freeze  #.freeze就把字串冻住了!    s[0] = "x"    p s

总整理

symbol : 效能较佳 不能修改内容 转字串用.to_s
string : 效能较差 可以修改内容 转符号用.to_sym

效能有没有差异大概也要写到很大一包才有感觉吧?!


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章