加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 什么是符号,我们如何使用它们?

发布时间:2020-12-16 22:50:41 所属栏目:百科 来源:网络整理
导读:我不明白什么是符号表.有人可以帮助我理解符号,从非常基础和彻底解释. 解决方法 符号的最基本用法很好地总结为短语:“符号是具有人类可读名称的常量整数”(Wei Lie Sho). 如果在C中键入: #define USER 1#define ADMIN 2#define GUEST 3[...]user.type = AD
我不明白什么是符号表.有人可以帮助我理解符号,从非常基础和彻底解释.

解决方法

符号的最基本用法很好地总结为短语:“符号是具有人类可读名称的常量整数”(Wei Lie Sho).

如果在C中键入:

#define USER 1
#define ADMIN 2
#define GUEST 3
[...]
user.type = ADMIN;

然后在ruby你只需使用一个符号:

user.type = :admin

所以,ruby中的符号只是一些价值,其中唯一重要的是名称,换句话说:符号的值是它的名字.

符号和字符串之间的主要区别(因为这也是正确的代码:user.type =“admin”)是符号很快.符号和整数(在本例中使用)的主要区别在于,符号对于程序员来说易于读取,而整数不是.

其他符号属性对于其基本使用并不重要.

虽然有一些与Symbols相关联的整数值(例如:.object_id),但您不应该依赖它.在程序的每次运行中,给定符号的整数值可能不同.但是,当程序运行时,每个(我们称之为),相同符号的“实例”将具有相同的整数值.

与整数常量(如C示例中)不同,“符号”不能在Ruby 1.8中排序 – 它们不知道是否大于另一个.

所以,您可以匹配符号(相等),就像整数匹配一样快,但是您不能直接在Ruby 1.8中排序符号.当然,您可以排序String等效的符号:

if user.type == :admin # OK
if user.type > :guest # will throw an exception.

[:two,:one].sort # will throw an exception
[:two,:one].sort_by {|n| n.to_s} # => [:one,:two]

符号的重要属性之一是,一旦在程序中遇到符号(键入源代码或“即时”创建),它的值将被存储到程序结束,而不是垃圾回收集.这就是你提到的“符号表”.

如果您在程序中创建了大量独特的符号(我谈到数百万),那么您的程序可能会耗尽内存.

所以,经验法则是:“不要将任何用户提供的值转换为符号”.

# A Rails-like example:
user.role = params["role"].to_sym # DANGEROUS!

我相信这组信息可能足以在Ruby中有效地使用Symbols.

请注意,在Ruby 1.9符号中包含“可比”,所以你可以做一些事情

p :yay if :foo > :bar

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读