Создать массив, не объявляя его первым - Ruby - PullRequest
2 голосов
/ 11 сентября 2010

Извините, если этот вопрос тупой, но я должен спросить. В PHP мы можем создать массив, не объявив его первым, хотя он и не считается хорошей практикой. Используя свои новые знания Ruby, я писал код, чтобы вывести список файлов в каталоге и отсортировать их по расширениям. Для этого я запустил цикл для помещения их в разные массивы в зависимости от их расширений. Как это:

files_by_ext = {} #edited - my bad, it was supposed to be {}
files_by_ext['css'] = ['file.css','file2.css','file3.css']
files_by_ext['html'] = ['file.html','file2.html','file3.html']

Тогда я бы сортировал, используя ключи 'css' и 'html'. Но в процессе создания массива файлов «X» мне нужно было проверить, существует ли ключ «X». Я не мог просто нажать файл (например, 'file.X').

Есть способ создать методы для изменения этого поведения, чтобы я мог создать массив, выдвигающий элемент, не объявив его первым?

files.each do |f|
 extension = /\.(.+)$/.match(f)[1].to_s
 files_by_ext[extension] << f
end

А нет (это то, что я делаю):

files.each do |f|
 extension = /\.(.+)$/.match(f)[1].to_s
 if !files_by_ext.key?(extension)
  files_by_ext[extension] = [f]
 else
  files_by_ext[extension] << f
 end
end

Извините, я думаю, что написал слишком много. : P Спасибо, что прочитали.

Ответы [ 3 ]

1 голос
/ 11 сентября 2010

Чтобы установить значение по умолчанию Array.new, необходимо передать Hash.new блок и назначить новый массив в хэш каждый раз, когда используется новый ключ.Это единственный правильный способ сделать это:

files_by_ext = Hash.new { |hsh, key| hsh[key] = Array.new }

Затем вы можете использовать ключи в этом хэше, как если бы у каждого ключа уже был массив.

files_by_ext['.com'] << 'command.com'

АльтернативаПодход, который очень часто используется, заключается в следующем:

files_by_ext = Hash.new
# ... later ...
files_by_ext['.com'] ||= Array.new
files_by_ext['.com'] << 'command.com'
0 голосов
/ 11 сентября 2010

Итак, пара вещей:

В отличие от PHP, Ruby различает массивы (класс Array) и ассоциативные массивы (класс Hash).Вам нужен ключ-> тип значения структуры, вы должны использовать Hash, к которому вы получите доступ по расширению файла.Значения вашего хэша могут быть массивами имен файлов.

Однако вы не хотите, чтобы имена файлов дублировались в этих значениях, поэтому вам следует рассмотреть использование класса Set вместо Array.Таким образом, вам не нужно беспокоиться, если вы уже вставили то же имя файла.

Другие уже писали об установке значения по умолчанию Hash.

0 голосов
/ 11 сентября 2010

Я не уверен, что правильно вас понимаю, но звучит немного так, как будто вы хотите установить по умолчанию начальное значение записи как пустой массив.Например, похоже, что чистым решением было бы создать хеш, в котором все его записи по умолчанию равны пустому массиву, а не нулю.В Ruby вы делаете это следующим образом:

>> h = Hash.new { |hash, key| hash[key] = Array.new }
{}
>> h[:foo] << "stuff"

Это избавит вас от необходимости проверять, существует ли запись перед ее добавлением.

...