。
那么,为什么Ruby的创建者在语言中使用symbols的概念呢?
我从一个非红宝石程序员的角度来问这个问题。我学过很多其他语言,但没有一种语言需要说明我是否在处理Ruby所称的symbols。
主要的问题是,Ruby中的symbols概念是为了性能而存在的,还是仅仅因为语言的编写方式而需要的呢?
Ruby中的程序会比它的Python或Javascript相对应的程序更轻或更快吗?如果是这样的话,会不会是因为symbols?
因为Ruby的目的之一是为人类方便地读写,所以不能让它的创建者通过在解释器本身中实现这些改进来简化编码过程(就像在其他语言中那样)?
看起来每个人都只想知道symbols是什么以及如何使用它们,而不是首先知道它们存在的原因。
发布于 2016-08-10 09:24:06
Ruby的创建者Yukihiro "Matz“Matsumoto,贴出一份解释讲述了Ruby是如何受到Lisp、Smalltalk、Perl的影响的(维基百科也说Ada和Eiffel ):
Ruby是一种按以下步骤设计的语言:
所以,从理论上讲,Ruby最初是一个Lisp。从现在起我们叫它MatzLisp。;-)
在任何编译器中,您都要管理函数、变量、命名块、类型等的标识符。通常,您将它们存储在编译器中,并在生成的可执行文件中忘记它们,但添加调试信息时除外。
在Lisp中,这些符号是一流的资源,托管在不同的包中,这意味着您可以在运行时添加新的符号,将它们绑定到不同类型的对象。这在元编程时很有用,因为您可以确保不会与代码的其他部分发生命名冲突。
此外,符号在读取时被嵌入,可以通过标识进行比较,这是一种有效的方法,可以获得新的值(如数字,但抽象)。这有助于编写直接使用符号值的代码,而不是定义由整数支持的枚举类型。此外,每个符号都可以保存其他数据。例如,Emacs/Slime可以将Emacs的元数据直接附加到符号的属性列表中。
符号的概念是Lisp的核心。例如,查看PAIP (人工智能编程的范例:公共Lisp中的案例研究,Norvig),以获得详细的示例。
发布于 2016-08-10 05:45:37
符号在Ruby中很有用,而且您可以在Ruby代码中看到它们,因为每个符号每次被引用时都会被重用。这是对字符串的性能改进,因为每次使用未保存在变量中的字符串都会在内存中创建一个新对象。例如,如果我多次使用相同的字符串作为散列键:
my_hash = {"a" => 1, "b" => 2, "c" => 3}
100_000.times { |i| puts my_hash["a"] }字符串"a“在内存中创建了101,000次。如果我用符号代替:
my_hash = {a: 1, b: 2, c: 3}
100_000.times { |i| puts my_hash[:a] }符号:a仍然是内存中的一个对象。这使得符号比字符串更加高效。
下面是一个基准测试(取自科德勒密),它演示了性能差异:
require 'benchmark'
string_AZ = Hash[("a".."z").to_a.zip((1..26).to_a)]
symbol_AZ = Hash[(:a..:z).to_a.zip((1..26).to_a)]
string_time = Benchmark.realtime do
100_000.times { string_AZ["r"] }
end
symbol_time = Benchmark.realtime do
100_000.times { symbol_AZ[:r] }
end
puts "String time: #{string_time} seconds."
puts "Symbol time: #{symbol_time} seconds."这是我的MBP的结果:
String time: 0.1254125550040044 seconds.
Symbol time: 0.07360960397636518 seconds.使用字符串和符号来识别散列中的键有明显的区别。
https://softwareengineering.stackexchange.com/questions/328029
复制相似问题