Почему аргументы File.new не являются символами, а не строками? - PullRequest
9 голосов
/ 25 сентября 2011

Мне было интересно, почему люди, написавшие библиотеку File, решили приводить аргументы, определяющие, в каком режиме файл открывается в строках, а не в символах.

Например, так оно и есть сейчас:

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

Но разве не лучше, например, сделать

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

или даже

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

?Кажется, это идеальное место для их использования, так как аргумент определенно не должен быть изменяемым.

Мне интересно знать, почему это так вышло.Обновление: я только что закончил читать связанный вопрос о символах и строках , и я думаю, что консенсус заключался в том, что символы просто не так хорошо известны, как строки, и каждый привык использовать строки для индексации хеш-таблицтем не мение.Тем не менее, я не думаю, что разработчики стандартной библиотеки Ruby допустили бы невежество по поводу символов, поэтому я не думаю, что это причина.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Я не специалист по истории ruby, но у вас действительно есть три варианта, когда вам нужны параметры для метода: строки, символы и статические классы.

Например, обработка исключений.Каждое исключение на самом деле является типом класса Exception.

ArgumentError.is_a? Class
=> True

Таким образом, вы можете иметь каждое разрешение для потока, являющегося его собственным классом.Но для этого потребуется создать еще больше классов для системы.

Суть символов в том, что они никогда не удаляются.Каждый генерируемый вами символ сохраняется неопределенно долго;поэтому использование метода .to_sym слегка не рекомендуется.Это приводит к утечкам памяти.

Струнами проще управлять.Если вы получили режим ввода от пользователя, вам понадобится '.to_sym' где-нибудь в вашем коде или, по крайней мере, большой оператор switch.Со строкой вы можете просто передать пользовательский ввод непосредственно методу (если вы, конечно, так доверяете).

Кроме того, в C вы передаете символ в метод ввода / вывода файла.В рубине нет символов, только строки.Видя, как ruby ​​построен на C, это может быть то, откуда он взялся.

1 голос
/ 25 сентября 2011

Это просто реликвия из предыдущих языков.

...