在ruby中,符号不能被字符串替换?

时间:2017-05-19 18:36:04

标签: ruby

据我所知,符号是减少字符串内存占用的方法。因此,在所有情况下,功能:firefox应相当于"firefox"

然而,在一些硒结合中,这似乎不适用。

https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings

driver = Selenium::WebDriver.for :remote, desired_capabilities: :firefox

如果我在该通话中将:firefox替换为"firefox",则会收到错误消息。这里的符号实际上不仅仅是一个内存效率更高的字符串吗?

3 个答案:

答案 0 :(得分:3)

Ruby中的

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是很常见的。

SymbolSymbol的转换在库代码中不太常见,因为很长一段时间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