在ruby中,不能用字符串替换的符号?
据我所知,符号是减少字符串内存占用的方法。所以在功能上在ruby中,不能用字符串替换的符号?,ruby,Ruby,据我所知,符号是减少字符串内存占用的方法。所以在功能上:firefox在所有情况下都应该等同于“firefox” 然而,在一些selenium绑定中,这似乎并不适用 如果我在该调用中将:firefox替换为“firefox”,我会得到一个错误。这里的符号实际上不仅仅是一个稍微节省内存的字符串吗?符号是一种数据类型 Selenium::WebDriver.for方法接受参数,并且可能希望哈希值是符号。我从未使用过这个类,也不知道for的最后一个参数是散列还是kwargs,但您知道:数据类型很重要
:firefox
在所有情况下都应该等同于“firefox”
然而,在一些selenium绑定中,这似乎并不适用
如果我在该调用中将:firefox
替换为“firefox”
,我会得到一个错误。这里的符号实际上不仅仅是一个稍微节省内存的字符串吗?符号是一种数据类型
Selenium::WebDriver.for
方法接受参数,并且可能希望哈希值是符号。我从未使用过这个类,也不知道for
的最后一个参数是散列还是kwargs,但您知道:数据类型很重要
传递“错误”数据类型时,会引发错误。要查看字符串和符号之间的差异,请参阅以下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
Ruby中的
String
s和Symbol
s从来都不是直接相等的。课堂上的差异在不止一个方面很重要,而且
:my_label != "my_label"
但是,
:my_label.to_s == "my_label"
Ruby符号
在以下几个方面比字符串
更有效:
散列和比较速度更快,这有助于用作散列键符号
- 同一
符号的多次使用不会复制内部数据,而只是指向内存中同一对象的相同指针。当你有很多相同的值时,这使得它们的内存效率更高
Selenium::WebDriver
使用符号作为参数,则不能总是用等效字符串替换它。您是否可以这样对待它取决于特定的库。将Symbol
s转换为String
s相对容易,反之亦然,因此许多库都会为您执行该转换。当库代码需要字符串
参数时,库代码通常会执行param=param.to
从
String
转换为Symbol
在库代码中不太常见,因为Ruby很长一段时间不会垃圾收集未引用的Symbol
对象-将任意String
值转换为等效的Symbol
值是导致内存泄漏的一种方式(以及攻击者使程序崩溃的向量)。一些库试图接受这两种方法,但确实,这不是自动的。Rails会宠坏人们:)4
与4.0
不一样。“4”与不一样:“4”
与[4]不一样。
与。。。
:my_label.to_s == "my_label"