何时在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,到目前为止,我所看到的符号主要用于替换哈希中重复使用的字符串。第二个链接比我作为副本发布的第一个链接要好得多,这两个链接的组合应该构成您的答案。如果还有什么不清楚的地方,请告诉我,我会尽力回答。谢谢!:)我想我更多了解的是符号的适当用例,而不是它们是否可以存储在散列中。也许我的问题没有我所希望的那么清楚安全点被很好地利用了;我一定会记住的。澄清一下:我根本不想用符号来表示可能会发生变化的数据,对吗?符号几乎不用于存储“数据”,尽管它们可能会像你所说的那样被使用。毫无理由地对字符串数据进行符号化通常会适得其反;所以实际的用途可能是为每个用户分配一个对象的内部引用?到目前为止,这似乎是(模糊地)我所看到的唯一一个实际用例。你能帮我更好地理解吗?