我听说两个同名的符号只创建一个内存区域,但是两个内容相同的字符串会创建两个内存区域。
答案 0 :(得分:2)
Symbol是您可以创建的最基本的Ruby对象。它只是一个名称和一个内部ID。符号很有用,因为给定的符号名称在整个Ruby程序中引用相同的对象。符号比字符串更有效。具有相同内容的两个字符串是两个不同的对象,但对于任何给定的名称,只有一个Symbol对象。这可以节省时间和内存。
# 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
答案 1 :(得分:2)
好的,所以误解可能源于此:
符号不是变量,而是值。像9
这样的值是一个数字。
符号是一个大致字符串的值...它不是一个你可以改变的字符串...而且因为你无法改变它,我们可以使用一个快捷方式 - >所有具有相同名称/值的符号都存储在同一个存储点中(以节省空间)。
您将符号存储到变量中,或者在某处使用该值 - 例如作为哈希的键....这最后可能是符号最常用的一种。
你创建一个包含键值对的哈希,例如:
thing_attrs = {:name => "My thing", :colour => "blue", :size => 6}
thing_attrs[:colour] # 'blue'
在这有 - 符号是键你可以使用任何对象作为键,但符号很好用,因为他们使用英语单词,因此很容易理解你是什么&#39 ;重新存储/获取...比数字更好。想象一下你有:
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'
除了我们知道...符号使用更少的内存。不是很少,但足够少,在大型程序中,随着时间的推移,你会注意到它。 所以它已成为使用符号的红宝石标准。
答案 2 :(得分:2)
我认为将符号视为没有所有花哨字符串功能的字符串是最有帮助的。 它们的主要用途是作为程序中其他内容的名称。 例如,假设您有用户信息的哈希值。 你可以做到
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
变量。
在回答第二个问题时,不,符号不是变量。 你不能“为它赋值”。 但是,正如您所看到的,符号有时可用于引用变量。