Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中,不能用字符串替换的符号?_Ruby - Fatal编程技术网

在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"