据我所知,符号是减少字符串内存占用的方法。因此,在所有情况下,功能:firefox
应相当于"firefox"
。
然而,在一些硒结合中,这似乎不适用。
https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings
driver = Selenium::WebDriver.for :remote, desired_capabilities: :firefox
如果我在该通话中将:firefox
替换为"firefox"
,则会收到错误消息。这里的符号实际上不仅仅是一个内存效率更高的字符串吗?
答案 0 :(得分:3)
Symbol
和:my_label != "my_label"
永远不会直接相等。课堂上的差异很重要,不止一种,
:my_label.to_s == "my_label"
然而,
Symbol
Ruby String
在某些方面比Symbol
效率更高,包括:
Symbol
哈希值并且比较快,这在使用哈希键时会有所帮助。
同一Selenium::WebDriver
的多次使用不会复制内部数据,但只是指向内存中同一对象的相同指针。当你有很多相同的值时,这会使它们的内存效率。
如果某个库(例如Symbol
)使用符号作为参数,那么您不能总是用等效字符串替换它。您是否可以像这样对待它取决于具体的库。将String
转换为param = param.to_s
s相对容易,反之亦然,因此很多库都会为您执行。在需要String
参数的情况下,库代码执行String
是很常见的。
从Symbol
到Symbol
的转换在库代码中不太常见,因为很长一段时间Ruby不会垃圾收集未引用的String
个对象 - 转换任意Symbol
等价{{1}}的值是一种获取内存泄漏的方法(以及攻击者崩溃程序的向量)。
答案 1 :(得分:2)
符号是数据类型。
Selenium::WebDriver.for
方法接受参数,并且可能希望哈希值为符号。我从来没有和班级一起工作,也不知道for
的最后一个论点是哈希还是哈瓦,但你明白了这一点: 数据类型很重要 。
当您传递“错误”数据类型时,会引发错误。
答案 2 :(得分:0)
要查看字符串和符号之间的区别,请参阅以下irb脚本:
irb(main):007:0> "firefox"
=> "firefox"
irb(main):008:0> "firefox".to_sym
=> :firefox
irb(main):009:0> "firefox".class
=> String
irb(main):010:0> "firefox".to_sym.class
=> Symbol