我听说两个名字相同的符号只创建一个内存区域,而两个具有相同内容的字符串创建两个内存区域。
发布于 2016-07-07 04:28:51
好吧,所以误解很可能是因为:
符号不是变量,而是值。和9一样,它是一个数值。
符号是一个大致是字符串的值.只是这不是一根绳子你可以改变..。由于您不能更改它,所以我们可以使用快捷方式-> --所有具有相同名称/值的符号都存储在相同的内存点中(以节省空间)。
将符号存储在变量中,或在某个地方使用该值(如作为散列的键).最后一种可能是符号最常见的用途之一。
您可以生成包含键值对的散列,例如:
thing_attrs = {:name => "My thing", :colour => "blue", :size => 6}
thing_attrs[:colour] # 'blue'在这里-符号是键,你可以使用任何物体作为键,但符号是很好的使用,因为他们使用英语单词,因此很容易理解你存储/获取什么……比数字要好得多。想象一下你有:
thing_attrs = {0 => "My thing", 1 => "blue", 2 => 6}
thing_attrs[1] # => "blue"这将是烦人和难以记住属性1是颜色.在阅读代码时,给出您可以读到的名称要好得多。因此,我们有两个选项:字符串或符号。
两者之间的差别很小。字符串绝对是可用的。
thing_attrs = {"name" => "My thing", "colour" => "blue", "size" => 6}
thing_attrs["colour"] # 'blue'除了我们都知道..。符号使用的内存较少。不是更少,而是足够少,在一个大的程序,随着时间的推移,你会注意到它。因此,使用符号已经成为红宝石的标准。
发布于 2016-07-07 04:20:07
符号是您可以创建的最基本的Ruby对象。它只是一个名称和一个内部ID。符号是有用的,因为一个给定的符号名是指整个Ruby程序中相同的对象。符号比字符串更有效。两个具有相同内容的字符串是两个不同的对象,但是对于任何给定的名称,只有一个符号对象。这既可以节省时间,也可以节省内存。
# p039symbol.rb
# use the object_id method of class Object
# it returns an integer identifier for an object
puts "string".object_id
puts "string".object_id
puts :symbol.object_id
puts :symbol.object_id
>ruby p039symbol.rb
21066960
21066930
132178
132178
>Exit code: 0发布于 2016-07-07 04:39:48
我发现把符号看作没有所有花哨的字符串特性的字符串是最有帮助的。它们的主要用途是作为您程序中其他事物的名称。例如,假设您有一个用户信息散列。你可以
user = { 'name' => 'Tim', 'age' => 20 }这里的散列键是字符串。这很好,但真的太过分了。字符串有许多花哨的方法,如替换和智能大写,而且它们是可变的(即字符串对象可以就地更改)。您永远不会更改散列键,因此您不需要这些。因此,最好只是使用符号
user = { :name => 'Tim', :age => 20 }符号出现的另一个地方是指类方法。假设我有以下课程
class Foo
def initialize(bar)
@bar = bar
end
end如果我需要从@bar外部访问Foo的值,我需要向Foo添加一个getter方法。会是这样的
class Foo
def initialize(bar)
@bar = bar
end
def bar
bar
end
end然而,这是一件很常见的事情,所以ruby提供了以下速记
class Foo
attribute_reader :bar
def initialize(bar)
@bar = bar
end
end这告诉Foo为我们创建以前版本中手工添加的方法。如您所见,我们使用符号引用@bar变量。
在回答你的第二个问题时,不,符号不是变量。你不能“给它赋值”。但是,正如您所看到的,符号有时可以用于引用变量。
https://stackoverflow.com/questions/38237378
复制相似问题