开发者

Why aren't the arguments to File.new symbols instead of strings?

开发者 https://www.devze.com 2023-04-07 13:44 出处:网络
I was wondering why the people who wrote the File library decided to make the arguments that determine what mode the file is opened in strings instead of symbols.

I was wondering why the people who wrote the File library decided to make the arguments that determine what mode the file is opened in strings instead of symbols.

For example, this is how it is now:

开发者_Python百科
f = File.new('file', 'rw')

But wouldn't it be a better design to do

f = File.new('file', :rw)

or even

f = File.new(:file, :rw)

for example? This seems to be the perfect place to use them since the argument definitely doesn't need to be mutable.

I am interested in knowing why it came out this way.


Update: I just got done reading a related question about symbols vs. strings, and I think the consensus was that symbols are just not as well known as strings, and everyone is used to using strings to index hash tables anyway. However, I don't think it would be valid for the designers of Ruby's standard library to plead ignorance on the subject of symbols, so I don't think that's the reason.


I'm no expert in the history of ruby, but you really have three options when you want parameters to a method: strings, symbols, and static classes.

For example, exception handling. Each exception is actually a type of class Exception.

ArgumentError.is_a? Class
=> True

So you could have each permission for the stream be it's own class. But that would require even more classes to be generated for the system.

The thing about symbols is they are never deleted. Every symbol you generate is preserved indefinitely; it's why using the method '.to_sym' lightly is discouraged. It leads to memory leaks.

Strings are just easier to manipulate. If you got the input mode from the user, you would need a '.to_sym' somewhere in your code, or at the very least, a large switch statement. With a string, you can just pass the user input directly to the method (if you were so trusting, of course).

Also, in C, you pass a character to the file i/o method. There are no Chars in ruby, just strings. Seeing as how ruby is built on C, that could be where it comes from.


It is simply a relic from previous languages.

0

精彩评论

暂无评论...
验证码 换一张
取 消