Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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_Symbols - Fatal编程技术网

何时在Ruby中使用符号

何时在Ruby中使用符号,ruby,symbols,Ruby,Symbols,我不清楚符号的价值和正确使用 这样做的好处似乎是,它们不再需要同一散列的多个副本,只允许它存在于内存中。我想知道这是不是真的,以及这会带来什么其他好处 如果我正在创建一个具有属性的用户对象,例如名称、电子邮件、和密码,并为每个属性使用符号而不是字符串,这是否意味着每个属性只有一个对象?这似乎可以避免散列中属性的字符串复制(这似乎是一件好事) 有人能帮我理解什么是符号,什么时候在散列中的字符串上使用符号更好?每种方法的优点和缺点是什么 还有,谁能说出每种方法的内存权衡?由于可伸缩性非常重要,我很好

我不清楚符号的价值和正确使用

这样做的好处似乎是,它们不再需要同一散列的多个副本,只允许它存在于内存中。我想知道这是不是真的,以及这会带来什么其他好处

如果我正在创建一个具有属性的用户对象,例如
名称
电子邮件
、和
密码
,并为每个属性使用符号而不是字符串,这是否意味着每个属性只有一个对象?这似乎可以避免散列中属性的字符串复制(这似乎是一件好事)

有人能帮我理解什么是符号,什么时候在散列中的字符串上使用符号更好?每种方法的优点和缺点是什么


还有,谁能说出每种方法的内存权衡?由于可伸缩性非常重要,我很好奇符号是否有助于提高速度。

您应该像数字一样考虑符号。它是第一次使用时创建的常量、不可变和非gc对象,您应该在需要引用不可复制的对象时使用它们,如:

  • 消息和方法(Ruby没有重载)
  • 散列键(Ruby没有多重散列)
符号,或也称为“内部构件”,对于哈希键、公共参数和其他地方非常有用,因为在这些地方,使用相同值的大量重复字符串的开销是无效的

例如:

params[:name]
my_function(with: { arguments: [ ... ] })
record.state = :completed
user_data = JSON.load(...).symbolize_keys
它们通常比字符串更可取,因为它们会频繁重复

最常见的用途是:

  • 散列键
  • 方法的参数
  • 选项标志或枚举类型属性值
在处理未知组合的用户数据时,最好使用字符串。与可以垃圾收集的字符串不同,符号是永久的。将任意用户数据转换为符号可能会用垃圾填满符号表,如果有人恶意,可能会使应用程序崩溃

例如:

params[:name]
my_function(with: { arguments: [ ... ] })
record.state = :completed
user_data = JSON.load(...).symbolize_keys

这将允许攻击者使用故意使用的长随机名称创建JSON数据,最终会用各种无用的垃圾填充您的进程。

是的,您的示例很好

名称、电子邮件和密码都可以存储为符号,甚至可以存储在散列中——特定对象仍然可以是字符串对象

{
  :name => 'John doe',
  :email => 'foo@hotmail.com',
  :password => 'lassdgjkl23853'
}

除了避免重复内存分配的需要外,可以比字符串更快地比较符号是否相等,并且可以比字符串更快地计算它们的哈希代码(因此,当使用符号键而不是字符串键时,从
哈希中存储和检索数据都会更快)

在内部,Ruby使用与符号密切相关的东西来标识方法、类的名称等等。因此,例如,当您检索一个对象支持的方法列表时(使用
obj.methods
),您将返回一个符号数组。当您想使用存储在变量中或作为参数传入的名称“动态”调用方法时,必须使用符号。同样,用于获取/设置实例变量、常量等的值

直觉上,你可以这样想。如果你曾经用C语言编程,你写过这样的东西:

 #define SOMETHING 1
 #define SOMETHING_ELSE 2
这些定义消除了在代码中使用“幻数”的需要。所使用的名称(
SOMETHING
等)与程序的用户无关,就像函数或类的名称与用户无关一样。它们只是代码内部的“标签”,只与程序员有关。符号在Ruby程序中起着类似的作用。它们是一种数据类型,其性能属性类似于整数,但其文字语法使它们在人类程序员看来是有意义的名称


一旦你“了解”了Ruby符号的概念,如果你用Lisp编程,理解Lisp符号就会容易得多。在Lisp语言中,符号是构成程序代码的基本数据类型。(因为Lisp程序是数据,可以进行操作。)

可能有用,谢谢。你知道相对内存的权衡吗?我可以看出创建的对象越少,一般来说,我认为创建的对象越少越好。但我对实际的性能体验或对实际权衡的更多见解感到好奇。我不明白你为什么要提到哈希。哈希和你的问题有关系吗?我不知道你所说的“需要同一个散列的多个副本”是什么意思。就像我说的,我是ruby新手,所以我可能没有说得那么清楚。我提到了哈希bc,到目前为止,我所看到的符号主要用于替换哈希中重复使用的字符串。第二个链接比我作为副本发布的第一个链接要好得多,这两个链接的组合应该构成您的答案。如果还有什么不清楚的地方,请告诉我,我会尽力回答。谢谢!:)我想我更多了解的是符号的适当用例,而不是它们是否可以存储在散列中。也许我的问题没有我所希望的那么清楚安全点被很好地利用了;我一定会记住的。澄清一下:我根本不想用符号来表示可能会发生变化的数据,对吗?符号几乎不用于存储“数据”,尽管它们可能会像你所说的那样被使用。毫无理由地对字符串数据进行符号化通常会适得其反;所以实际的用途可能是为每个用户分配一个对象的内部引用?到目前为止,这似乎是(模糊地)我所看到的唯一一个实际用例。你能帮我更好地理解吗?