Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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_String_Symbols - Fatal编程技术网

Ruby 符号(将字符串存储在变量和符号中)

Ruby 符号(将字符串存储在变量和符号中),ruby,string,symbols,Ruby,String,Symbols,我看到字符串的object\u id总是不同的,而符号的object\u id是相同的(如果值相等)。据我所知,符号和字符串之间的区别在于不变性和性能。我们不能将字符串存储在变量中并将其冻结吗?冻结防止修改实际对象,但是变量是对对象的引用,因此您仍然可以更改引用。下面的例子非常有效 a = "foo" a.freeze a = "boo" 在此末尾,a等于“boo” 在Ruby版本2.1和更早版本中,一个符号被分配了一个可用的对象id,并且每当使用相同的符号标识符时,总是使用相同的对象id;这

我看到字符串的
object\u id
总是不同的,而符号的
object\u id
是相同的(如果值相等)。据我所知,符号和字符串之间的区别在于不变性和性能。我们不能将字符串存储在变量中并将其冻结吗?

冻结
防止修改实际对象,但是变量是对对象的引用,因此您仍然可以更改引用。下面的例子非常有效

a = "foo"
a.freeze
a = "boo"
在此
末尾,a
等于“boo”

在Ruby版本2.1和更早版本中,一个符号被分配了一个可用的
对象id
,并且每当使用相同的符号标识符时,总是使用相同的对象id;这是从来没有垃圾收集。这是不可变的,但也更有效(内存开销更少)

在Ruby 2.2及以上版本中,行为基本相同,只是符号可以被垃圾收集。此更改的原因是为了防止符号拒绝服务攻击

[…]我们不能将字符串存储在变量中并冻结它吗

Ruby的最新版本几乎可以优化冻结字符串:

'foo'.freeze.object_id #=> 70313275108080
'foo'.freeze.object_id #=> 70313275108080
但这种优化是有限的。它适用于字符串文字(如上所示),但如果以后冻结字符串,则不起作用:

a = 'foo'
a.freeze
a.object_id #=> 70313275335500

b = 'foo'
b.freeze
b.object_id #=> 70313275274260
除非启用
冻结字符串\u文字
功能:

# frozen_string_literal: true

puts 'foo'.object_id
puts 'foo'.object_id
输出:

$ ruby test.rb
70185151269500
70185151269500
或者,从命令行:

$ ruby --enable-frozen-string-literal -e "puts 'foo'.object_id, 'foo'.object_id"
70102955495340
70102955495340

那么,在哪里使用字符串,在哪里使用符号呢?@RamziddinMakhmudov如果字符串的内容很重要,即字符,就使用字符串。如果您想要标识符或标签,请使用符号。感谢您提供清晰易懂的答案=)顺便说一句,冻结字符串优化是对字符串的优化。这不是用来代替符号的。谢谢你的帮助,Stefan!我很感激:)那么在哪里使用字符串,在哪里使用符号呢?谢谢你的回答!我将阅读有关symbol DoS攻击的内容:)