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)
例如?这似乎是使用它们的最佳位置,因为参数肯定不需要是可变的.
我有兴趣知道它为什么会这样出现.
小智 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 之上的,这可能就是它的来源。