符号的用途是什么?

时间:2016-07-07 04:04:47

标签: ruby symbols

我听说两个同名的符号只创建一个内存区域,但是两个内容相同的字符串会创建两个内存区域。

  • 符号的用途是什么?
  • 符号是变量吗?如果是这样,我如何为符号赋值?
  • 如果我只为具有相同名称的符号分配一次内存,我对符号做了什么?

3 个答案:

答案 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变量。

在回答第二个问题时,不,符号不是变量。 你不能“为它赋值”。 但是,正如您所看到的,符号有时可用于引用变量。