如何学习ruby:比较详细的ruby symbol 学习资料

解释不错应该明确了不少
ruby symbol详解
起因
最近在学习ruby _disibledevent=>这是个指向链接如果没有冒号这句话意思很好理解:这是个指向http://127.0.0.1:3000/recipe/show/1连接也就是“显示”数据库表recipe中“id”为1条目信息但让人不解是action和id前面冒号它们是干甚么用
ruby面向对象特性个缺点
ruby中切皆是对象个简单串举例:
ruby -e ‘puts “hello world”.'
String
这里打印了”hello world”串所属结果显示它是个String对象例子我们还可以显示它对象号
ruby -e ‘puts “hello world”.object_id'
41436168
ruby向标榜自己是完全面向对象原因就在于此确做很彻底但是凡事有好就有坏个对象占用内存空间显然会比纯粹变量大得多中涉及到大量串时个ruby会占用过多内存举个例子说:
我们用hash列表来存储歌曲信息
song1 = { ‘title' => ‘used to love you', ‘artist' => ‘john legend'}
song2 = { ‘title' => ‘i still', ‘artist' => ‘backstreet boys'}
#……
#很多歌这里只用两首
for i in 1..2
thesong=”song”+i.to_s
eval <<-PROC
#{thesong}.each_key { |key| puts key.object_id.to_s }
PROC
end
结果:
41436144
41436408
41435904
41436000
object_id各不相同在hash表中各个key都是独立String对象即使内容相同(如'title')ruby还是将其视为区别对象这样就无端地占用了不少内存但事实上大多数情况下我们仅将hash中key视为字段而已不会涉及到String类思路方法ruby自动将其设置为对象有杀鸡用牛刀的嫌
symbol是什么
直译来说就是“符号”在ruby就是形如:action这样个冒号后跟显然根据“切都是对象”定律它也是个对象
ruby -e ‘ puts :action.
Symbol
这个对象存在意义在于它解决了“同内容区别对象”带来过多占用内存问题简单说:action代表了'action'这里说不是串对象
ruby -e ‘ puts :action ‘
action
更确切讲就是个symbol对象代表该对象冒号后
ruby -e ‘ puts :action ‘
action
ruby -e ‘ puts :”hello world” ‘
hello world
所有同内容串只需要个标记对象就可以代替这样减少了不必要对象建立和内存占用但是正如我强调“symbol代表不是对象”因此不要希望标记可以使用String类诸如capitalizecenter等思路方法如果使用话只会得到提示思路方法未定义报告:
ruby -e ‘ puts :action.capitalize ‘
-e:1: und method ‘capitalize' for :action:Symbol' (NoMethodError)
幸运symbol提供了转换to_s用来生成串对象它会提取串内容并将其升级为对象
ruby -e ‘ puts :action.to_s.capitalize ‘
Action
另外很重要点是symbol没有赋值思路方法换句话说symbol旦定义将不能改变
ruby -e ‘ :action=”hello” ‘
syntax error
很遗憾即使使用了to_s赋值依然无法顺利进行ruby会认为“to_s=”是个未定义除非明确地为被转换生成串对象指定个引用(但事实上在复制的后该连接指向又发生了变化):
:action
myaction=:action.to_s
myaction=”lala”
puts myaction
结果:
lala
如何使用symbol
任何可以使用symbol地方都可以使用和的向对应串对象在rails中有建立类似javabean思路方法:
attr_reader :action
它建立了个读取例子变量@action思路方法也可以写成这样:
attr_reader “action”
反的只要
串在运行过程中不用改变
串不必使用String类思路方法
那么我们可以放心用symbol来代替串对象从而大大减少内存占用在rails中尤为明显需要频繁地在各个控制思路方法和页面的间跳转和传出数据大量思路方法名由symbol来代替及节约了内存也提高了运行速度
Tags:  thelostsymbol undefinedsymbol symbol 如何学习ruby

延伸阅读

最新评论

发表评论