Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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,如果使用符号1)节省内存2)具有更好的访问时间,为什么要使用字符串 我看到的代码有时使用字符串,有时使用符号。为什么你会选择具有符号所有优点的字符串 好的,您的访问键通常不会是字符串,因此您将始终键入类型转换。但是,为什么不隐式地进行铸造呢 我看到的代码有时使用字符串,有时使用符号。为什么你会选择具有符号所有优点的字符串 在Ruby 2.2中添加之前,在运行时生成符号会导致长时间运行的应用程序内存泄漏。使用字符串是一种规避内存问题并获取gc的方法,它在ruby生态系统中随处可见。使用冻结字符串支

如果使用符号1)节省内存2)具有更好的访问时间,为什么要使用字符串

我看到的代码有时使用字符串,有时使用符号。为什么你会选择具有符号所有优点的字符串

好的,您的访问键通常不会是字符串,因此您将始终键入类型转换。但是,为什么不隐式地进行铸造呢

我看到的代码有时使用字符串,有时使用符号。为什么你会选择具有符号所有优点的字符串

在Ruby 2.2中添加之前,在运行时生成符号会导致长时间运行的应用程序内存泄漏。使用字符串是一种规避内存问题并获取gc的方法,它在ruby生态系统中随处可见。使用冻结字符串支持,在某些点上符号和字符串将是相同的

好的,您的访问键通常不会是字符串,因此您将始终键入类型转换。但是,为什么不隐式地进行铸造呢

散列将对象映射到对象。这:

{"a"=>1, :a=>1}
是一个有效的散列

如果要隐式强制转换,可以使用来自ActiveSupport的

我看到的代码有时使用字符串,有时使用符号。为什么你会选择具有符号所有优点的字符串

在Ruby 2.2中添加之前,在运行时生成符号会导致长时间运行的应用程序内存泄漏。使用字符串是一种规避内存问题并获取gc的方法,它在ruby生态系统中随处可见。使用冻结字符串支持,在某些点上符号和字符串将是相同的

好的,您的访问键通常不会是字符串,因此您将始终键入类型转换。但是,为什么不隐式地进行铸造呢

散列将对象映射到对象。这:

{"a"=>1, :a=>1}
是一个有效的散列


如果您想要隐式强制转换,您可以使用ActiveSupport。

有不同的权衡

  • 符号最好用于有界的键集,这些键在理想情况下仅限于源代码中的值
  • 字符串最适合用于从用户输入或其他外部源获取的无界键集,如处理非结构化JSON数据时
为什么?


在Ruby 2.2之前,符号不是垃圾收集的,处理一组无界的键显然会导致内存泄漏。但是,即使是车库收藏,仍然需要花费大量的成本来“实习”所有字符串输入,以便将它们转换为符号。因此,如果您的代码使用文本文件或web中的字符串,那么使用字符串键可能是最明智的选择。

有不同的权衡

  • 符号最好用于有界的键集,这些键在理想情况下仅限于源代码中的值
  • 字符串最适合用于从用户输入或其他外部源获取的无界键集,如处理非结构化JSON数据时
为什么?



在Ruby 2.2之前,符号不是垃圾收集的,处理一组无界的键显然会导致内存泄漏。但是,即使是车库收藏,仍然需要花费大量的成本来“实习”所有字符串输入,以便将它们转换为符号。因此,如果您的代码使用文本文件或web中的字符串,那么使用字符串键可能是最明智的做法。

当引用该键的东西总是以字符串开头时,我认为将它们保留为字符串是值得的。另外,我最近不得不使用整数作为键。就我所知,它们不能转换为符号。将数字作为键实际上是一个很好的观点。你知道键可以是任何东西,对吗?类、字符串、数组、哈希、符号、过程。。。为什么要对字符串做一个特殊的例外呢?不,我没有,谢谢你提供的信息。当引用键的东西总是以字符串开头时,我想把它们作为字符串保存是值得的。另外,我最近不得不使用整数作为键。就我所知,它们不能转换为符号。将数字作为键实际上是一个很好的观点。你知道键可以是任何东西,对吗?类、字符串、数组、哈希、符号、过程。。。为什么要对字符串做一个特殊的例外呢?不,我没有,谢谢你提供的信息。在哪种情况下,你希望使用“a”和:a.访问密钥。。听起来更像是一个尖锐的边缘案例,它造成的麻烦比解决的麻烦多最后一句话是误导性的“在冻结字符串支持下,在某些点上符号和字符串将是相同的”-符号和不可变字符串之间有很大的区别,保证只有一个
:abc
的实例,但是
“abc”
的实例可能很多,因此在运行时将字符串插入符号也是非常重要的。在某些应用程序中,这仍然是一个非常有效的参数,用于首选字符串键。@akuhn使用冻结字符串pragma时,相同值的不可变字符串是相同的对象。请看:没有,只需尝试
a='hello';b=‘世界’;10.times{p(a+b).freeze.object_id}
这篇博文没有充分的信息和误导性。@akuhn答案是正确的。冻结字符串pragma与仅冻结字符串不同。它是一个特殊的注释(
#冻结的字符串(literal:true
)放在文件顶部,默认情况下会冻结所有字符串文本。这个prama确实会导致具有相同值的字符串文本成为相同的对象。在未来的Ruby版本中,pragma将成为默认值:这就是答案的意思:“在冻结字符串支持下,在某些情况下符号和字符串将是相同的。”在哪种情况下,您希望使用“a”和:a访问密钥。。听起来更像是一个尖锐的边缘案例,它造成的麻烦比它解决的麻烦多。最后一句话是误导性的,“在冻结字符串支持下,在某些点上符号和字符串将是相同的”——符号和字符串之间有很大的区别