为什么不是File.new符号的参数而不是字符串?

Set*_*gie 9 ruby symbols language-design

我想知道为什么编写File库的人决定制作参数来确定文件以字符串而不是符号打开的模式.

例如,现在就是这样:

f = File.new('file', 'rw')
Run Code Online (Sandbox Code Playgroud)

但这不是一个更好的设计

f = File.new('file', :rw)
Run Code Online (Sandbox Code Playgroud)

甚至

f = File.new(:file, :rw)
Run Code Online (Sandbox Code Playgroud)

例如?这似乎是使用它们的最佳位置,因为参数肯定不需要是可变的.

我有兴趣知道它为什么会这样出现.


更新:我刚读完一个关于符号与字符串的相关问题,我认为共识是符号不像字符串那样众所周知,并且每个人都习惯使用字符串来索引哈希表.但是,我不认为Ruby标准库的设计者对符号主题的无知是有效的,所以我不认为这就是原因.

小智 2

我不是 ruby​​ 历史方面的专家,但是当您想要方法的参数时,您确实有三个选择:字符串、符号和静态类。

例如,异常处理。每个异常实际上都是 Exception 类的一种类型。

ArgumentError.is_a? Class
=> True
Run Code Online (Sandbox Code Playgroud)

因此,您可以拥有流的每个权限,这是它自己的类。但这需要为系统生成更多的类。

关于符号的事情是它们永远不会被删除。您生成的每个符号都会无限期保留;这就是为什么不鼓励轻易使用“.to_sym”方法。它会导致内存泄漏。

字符串更容易操作。如果您从用户那里获得了输入模式,则代码中的某处需要一个“.to_sym”,或者至少需要一个大的 switch 语句。使用字符串,您可以将用户输入直接传递给该方法(当然,如果您如此信任的话)。

另外,在 C 中,您将一个字符传递给文件 i/o 方法。ruby 中没有字符,只有字符串。看看 ruby​​ 是如何构建在 C 之上的,这可能就是它的来源。