#ruby #arrays
#ruby #массивы
Вопрос:
Я программист-новичок, и мне интересно, как создать имена массивов, используя список слов из другого массива.
Например, я хотел бы взять этот массив:
array = ['fruits','veggies']
и превратите это во что-то вроде этого:
fruits = []
veggies = []
Каков наилучший способ сделать это в Ruby?
Вот мой вариант, в котором я с треском провалился:
variables = ['awesome', 'fantastic', 'neato']
variables.each do |e|
e = []
e << [1, 2, 3]
end
puts neato
Комментарии:
1. Это для проверки поисковой выдачи. Пользователь вводит свои ключевые слова, а затем, когда я ищу в Google по списку ключевых слов, я хочу иметь возможность получать результаты поисковой выдачи и помещать их в массив, названный по ключевому слову, которое только что было найдено. И тогда я могу взять каждый массив и проверить, где находится их URL в списке. Я надеюсь, что это объясняет это достаточно хорошо.
Ответ №1:
Проблема в том, что ваш массив может содержать значение, совпадающее с именем локальной переменной или метода, и вот тогда начинается боль и путаница.
Вероятно, лучше всего вместо этого создать хэш массивов:
variables = ['awesome', 'fantastic', 'neato']
hash = variables.each_with_object({ }) { |k, h| h[k] = [ ] }
Или, если у вас нет each_with_object
:
hash = variables.inject({ }) { |h, k| h[k] = [ ]; h }
Обратите внимание на изменение порядка аргументов в блоке с помощью inject
и на то, что вы должны вернуть h
из блока.
Таким образом, у вас есть свои массивы, но вы также защищаете свое пространство имен, по сути, используя хэш как небольшое переносимое пространство имен. Вы можете создавать переменные «на лету», как демонстрирует Джейкоб Релкин, но вы напрашиваетесь на неприятности, делая это таким образом. Вы также можете столкнуться с проблемами, если элементы variables
в конечном итоге не будут буквенно-цифровыми.
Ответ №2:
arr = ['a', 'b', 'c']
arr.each do |a|
self.instance_variable_set(('@' a.to_s).intern, [1,2,3])
}
puts @a #[1,2,3]
Комментарии:
1. Когда я запускаю его с этим, я получаю неопределенный метод или переменную при попытке распечатать один из новых массивов. Например, я попробовал: помещает awesome.to_s и я получаю эту ошибку
2. @Melanie, смотрите мой обновленный ответ. Вы должны быть в состоянии заставить это работать.