首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >符号的用途是什么?

问符号的用途是什么?
EN

Stack Overflow用户
提问于 2016-07-07 04:04:46
回答 3查看 731关注 0票数 2

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

  • 符号的用途是什么?
  • 符号像变量吗?如果是这样的话,我如何给符号赋值?
  • 如果我只为同名符号分配一次内存,那么我对这些符号做什么呢?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-07 04:28:51

好吧,所以误解很可能是因为:

符号不是变量,而是值。和9一样,它是一个数值。

符号是一个大致是字符串的值.只是这不是一根绳子你可以改变..。由于您不能更改它,所以我们可以使用快捷方式-> --所有具有相同名称/值的符号都存储在相同的内存点中(以节省空间)。

将符号存储在变量中,或在某个地方使用该值(如作为散列的键).最后一种可能是符号最常见的用途之一。

您可以生成包含键值对的散列,例如:

代码语言:javascript
复制
thing_attrs = {:name => "My thing", :colour => "blue", :size => 6}
thing_attrs[:colour]  # 'blue'

在这里-符号是键,你可以使用任何物体作为键,但符号是很好的使用,因为他们使用英语单词,因此很容易理解你存储/获取什么……比数字要好得多。想象一下你有:

代码语言:javascript
复制
thing_attrs = {0 => "My thing", 1 => "blue", 2 => 6}
thing_attrs[1] # => "blue"

这将是烦人和难以记住属性1是颜色.在阅读代码时,给出您可以读到的名称要好得多。因此,我们有两个选项:字符串或符号。

两者之间的差别很小。字符串绝对是可用的。

代码语言:javascript
复制
thing_attrs = {"name" => "My thing", "colour" => "blue", "size" => 6}
thing_attrs["colour"]  # 'blue'

除了我们都知道..。符号使用的内存较少。不是更少,而是足够少,在一个大的程序,随着时间的推移,你会注意到它。因此,使用符号已经成为红宝石的标准。

票数 4
EN

Stack Overflow用户

发布于 2016-07-07 04:20:07

符号是您可以创建的最基本的Ruby对象。它只是一个名称和一个内部ID。符号是有用的,因为一个给定的符号名是指整个Ruby程序中相同的对象。符号比字符串更有效。两个具有相同内容的字符串是两个不同的对象,但是对于任何给定的名称,只有一个符号对象。这既可以节省时间,也可以节省内存。

代码语言:javascript
复制
# 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
票数 3
EN

Stack Overflow用户

发布于 2016-07-07 04:39:48

我发现把符号看作没有所有花哨的字符串特性的字符串是最有帮助的。它们的主要用途是作为您程序中其他事物的名称。例如,假设您有一个用户信息散列。你可以

代码语言:javascript
复制
user = { 'name' => 'Tim', 'age' => 20 }

这里的散列键是字符串。这很好,但真的太过分了。字符串有许多花哨的方法,如替换和智能大写,而且它们是可变的(即字符串对象可以就地更改)。您永远不会更改散列键,因此您不需要这些。因此,最好只是使用符号

代码语言:javascript
复制
user = { :name => 'Tim', :age => 20 }

符号出现的另一个地方是指类方法。假设我有以下课程

代码语言:javascript
复制
class Foo
  def initialize(bar)
    @bar = bar
  end
end

如果我需要从@bar外部访问Foo的值,我需要向Foo添加一个getter方法。会是这样的

代码语言:javascript
复制
class Foo
  def initialize(bar)
    @bar = bar
  end

  def bar
    bar
  end
end

然而,这是一件很常见的事情,所以ruby提供了以下速记

代码语言:javascript
复制
class Foo
  attribute_reader :bar

  def initialize(bar)
    @bar = bar
  end
end

这告诉Foo为我们创建以前版本中手工添加的方法。如您所见,我们使用符号引用@bar变量。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38237378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档