首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Ruby创建者选择使用符号的概念?

为什么Ruby创建者选择使用符号的概念?
EN

Software Engineering用户
提问于 2016-08-10 02:35:44
回答 2查看 2.7K关注 0票数 17

博士:符号是否有语言不可知论的定义,为什么要使用其他语言?

那么,为什么Ruby的创建者在语言中使用symbols的概念呢?

我从一个非红宝石程序员的角度来问这个问题。我学过很多其他语言,但没有一种语言需要说明我是否在处理Ruby所称的symbols

主要的问题是,Ruby中的symbols概念是为了性能而存在的,还是仅仅因为语言的编写方式而需要的呢?

Ruby中的程序会比它的Python或Javascript相对应的程序更轻或更快吗?如果是这样的话,会不会是因为symbols

因为Ruby的目的之一是为人类方便地读写,所以不能让它的创建者通过在解释器本身中实现这些改进来简化编码过程(就像在其他语言中那样)?

看起来每个人都只想知道symbols是什么以及如何使用它们,而不是首先知道它们存在的原因。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2016-08-10 09:24:06

Ruby的创建者Yukihiro "Matz“Matsumoto,贴出一份解释讲述了Ruby是如何受到Lisp、Smalltalk、Perl的影响的(维基百科也说Ada和Eiffel ):

Ruby是一种按以下步骤设计的语言:

  • 以一种简单的lisp语言为例(就像CL之前的语言)。
  • 删除宏,S-表达式。
  • 添加简单的对象系统(比CLOS简单得多)。
  • 添加块,灵感来自高阶函数。
  • 添加Smalltalk中的方法。
  • 添加Perl中的功能(以面向对象的方式)。

所以,从理论上讲,Ruby最初是一个Lisp。从现在起我们叫它MatzLisp。;-)

在任何编译器中,您都要管理函数、变量、命名块、类型等的标识符。通常,您将它们存储在编译器中,并在生成的可执行文件中忘记它们,但添加调试信息时除外。

在Lisp中,这些符号是一流的资源,托管在不同的包中,这意味着您可以在运行时添加新的符号,将它们绑定到不同类型的对象。这在元编程时很有用,因为您可以确保不会与代码的其他部分发生命名冲突。

此外,符号在读取时被嵌入,可以通过标识进行比较,这是一种有效的方法,可以获得新的值(如数字,但抽象)。这有助于编写直接使用符号值的代码,而不是定义由整数支持的枚举类型。此外,每个符号都可以保存其他数据。例如,Emacs/Slime可以将Emacs的元数据直接附加到符号的属性列表中。

符号的概念是Lisp的核心。例如,查看PAIP (人工智能编程的范例:公共Lisp中的案例研究,Norvig),以获得详细的示例。

票数 19
EN

Software Engineering用户

发布于 2016-08-10 05:45:37

符号在Ruby中很有用,而且您可以在Ruby代码中看到它们,因为每个符号每次被引用时都会被重用。这是对字符串的性能改进,因为每次使用未保存在变量中的字符串都会在内存中创建一个新对象。例如,如果我多次使用相同的字符串作为散列键:

代码语言:javascript
复制
my_hash = {"a" => 1, "b" => 2, "c" => 3}
100_000.times { |i| puts my_hash["a"] }

字符串"a“在内存中创建了101,000次。如果我用符号代替:

代码语言:javascript
复制
my_hash = {a: 1, b: 2, c: 3}
100_000.times { |i| puts my_hash[:a] }

符号:a仍然是内存中的一个对象。这使得符号比字符串更加高效。

下面是一个基准测试(取自科德勒密),它演示了性能差异:

代码语言:javascript
复制
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的结果:

代码语言:javascript
复制
String time: 0.1254125550040044 seconds.
Symbol time: 0.07360960397636518 seconds.

使用字符串和符号来识别散列中的键有明显的区别。

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

https://softwareengineering.stackexchange.com/questions/328029

复制
相关文章

相似问题

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