Ruby的符号足以让很多初学者迷惑上一段时间,看过本章节后,或许会解开你心中的疑惑。
在Ruby中,一个符号是就是一个Symbol类的实例,它的语法是在通常的变量名前加一个冒号,如
:my_sy
Ruby的符号像一个字符串,因为它内部表现形式是一个字符序列。而与字符串不同的是,每个符号的实例只有一个。看下面的例子:
array = ["foo", "foo", "foo", :foo, :foo, :foo]
建立这个数组后,内存中将有三个内容为"foo"的字符串对象,而只有一个:foo对象。
一个符号有它唯一对应的一个整数值,可以用to_i来获取它。
符号常用的地方是用它来代表变量名或者方法名:
class SomeClass
attr_accessor :whatever
end
与上面程序对等的程序如下:
class SomeClass
def whatever
@whatever
end
def whatever=(val)
@whatever = val
end
end
你可能会问,为什么不用字符串来表示呢?其实,字符串也是可以的:
attr_reader :alpha
attr_reader "beta" # 也是合法的
那它们的区别在哪里?某种意义上来说,是为了提高程序性能,节省内存吧。
有的人说,"符号就如同不可变的字符串",从它的行为上来说,可能是对的。但是,Symbol并是是继承至String,而且,与字符串相关
的那些典型操作方法,Symbol也不一定有,也不需要有。
符号不一定看起来是像变量一样,它也可以这样:
sym1 = :"This is a symbol"
sym2 = :"This is, too!"
sym3 = :")(*&^%$"
你可以用这样奇怪的符号来定义实例变量名或方法,你可以使用诸如send或instance_variable_get来获取它们的引用。虽然是可行的,
但请尽量不要使用这么奇怪的符号。
用Symbol作为枚举
==========================================
像Pascal或版本稍晚的C语言,都存在enum这种类型。Ruby不能正真的拥有这样的类型,因为它没有类型检查。但使用Symbol可以用来产生
这样的效果:
North, South, East, West = :north, :south, :east, :west
用Symbol作为元数据
==========================================
通常我们使用捕获异常的方式来处理错误,避免使用老式的返回代码的方式。但是,如果你想用老式的方式,还是可以的。像nil就是这样一个元数据。
我们通常可以这样使用(因为符号是全局的,所以在之后的整个程序中,都可以使用这些符号来作为元数据):
str = get_string
case str
when String
# Proceed normally
when :eof
# end of file, socket closed, whatever
when :error
# I/O or network error
when :timeout
# didn't get a reply
end
Symbols, Variables, Methods
==========================================
Symbol最常用的地方就是我们熟知的定义属性了:
class MyClass
attr_reader :alpha, :beta
attr_writer :gamma, :delta
attr_accessor :epsilon
# ...
end
这里的方法,如attr_accessor,它以传入的符号来确定实例变量的名称,以及读写属性的方法的名称,但这不代表所有的情况
(即总是会自动精确匹配符号和实例变量的名称),例如,当使用instance_variable_set方法的时候,符号和实例变量名必须
精确给出:
sym1 = :@foo
sym2 = :foo
instance_variable_set(sym1,"str") # 正常,匹配到@foo
instance_variable_set(sym2,"str") # 错误
不过,记住,在这些地方不一定要使用符号,可以用字符串来替代。
转换Symbol
============================================
Symbol和字符串之间可以互相转换,使用to_s和to_sym来实现:
a = "foobar"
b = :foobar
a == b.to_str # true
b == a.to_sym # true
分享到:
相关推荐
Symbol Decoration gem 提供了符号方法扩展来实现 DSL,例如where(:field.in => [1,2,3]) 。 目标是允许不同的 ORM(例如 Mongoid 和 NoBrainer)共存,因为这两个 ORM 都需要此类功能。 用法 在以下示例中: where...
1. 什么是Ruby?简要介绍Ruby的特点和主要用途。 2. Ruby中的变量声明和赋值规则是什么?请说明Ruby变量声明和赋值的语法。 3. Ruby中常用的数据类型有...11. 什么是Ruby中的符号(Symbol)?请说明在Ruby中符号的作用
符号字符串symbol-fstring是Ruby扩展,提供对符号内部字符串表示形式的访问。为什么? 在Ruby中,许多API倾向于接受符号,但是会定期在内部将其转换为字符串。 典型的示例是ActiveSupport::...
2. 符号(Symbol)的概念及作用,如用于Hash的键。 3. Ruby中"一切皆对象"的理念,数字、布尔值、类、nil等都是对象。 4. Ruby中"一切皆表达式"的设计,控制语句、方法定义等都会返回值。 5. Ruby中"一切皆方法调用",...
这是一个简单的Ruby脚本,它打开文件夹路径中给定类型的所有文件,然后计算所有符号。 这可用于通知顶部如何安排可编程键盘。 具体来说,我曾经用来更新固件。 安装 该程序需要编程语言,并且是唯一的依赖项。 该...
IB-Ruby使用相同的概念来组织和优化运营问题,并支持研究和系统的交易工作。 列表按Enumerator进行组织,以扩展其使用范围。 该功能完全存在于文件系统中,不需要数据库,不涉及任何进一步的依赖关系。 默认情况下...
它允许我们在队列有效负载中使用符号作为值,方法是在将它们放入队列之前先对它们进行序列化,然后在队列在任何给定作业中执行代码之前对序列化的值进行反序列化。 安装 将此行添加到您的应用程序的Gemfile中: ...
SymbolTable:基于链表的符号表。 OrderlySymbolTable:基于优先级队列的有序符号表。 BinarySearchTree:基于指针的二叉搜索树。 TwoThreeTree:基于指针的2-3-tree,等待测试。 RBTree:基于指针的红黑树。 AVL...
115强化班第一节课:链接与Symbol 117强化班第二节课:符号与链接(下) 120强化班第三节课:动态库与静态库(上) 122强化班第四节课:动态库 125强化班第五节课:动态库与静态库(中) 127强化班第六节课:Swift库...
- 请参阅 symbols.txt) 运行“ruby get_stocks.rb {SYMBOL_LIST_FILE_NAME} {NUMBER_OF_DAYS_TO_RETRIEVE}” SYMBOL_LIST_FILE_NAME - 您创建的符号列表的文件名(例如symbols.txt)。 NUMBER_OF_DAYS_TO_RETRIEVE ...
Rails,则所有天气符号都包含在资产管道中,包括 svg 和 png 格式。 这意味着如果你想显示一个图标<%= image_tag day.symbol.svg %>或<%= image_tag day.symbol.png %>你可以做这样的事情。 PNG 文件...
假设实际值在数据库中存储为整数或字符串,但您希望在其余代码中使用符号。 例如,如果您有一个状态字段,您可能希望将值存储为 0 表示挂起,1 表示活动,2 表示已终止,但您希望将它们引用为 :active、:terminate ...