Вам нужно иметь изменяемую ссылку на каждый элемент. iter
возвращает неизменяемые ссылки. И неизменяемая ссылка на изменяемую переменную сама по себе не изменчива. Вместо этого используйте iter_mut
или for task in &mut self.tasks
.
Затем, проще всего сделать, чтобы встроить work_one
в work
:
pub fn work(&mut self) {
for task in self.tasks.iter_mut() {
task.do_it()
}
}
К сожалению, расщепление этого на две функции довольно болезненно. Вы должны гарантировать, что вызов self.work_one
не изменит self.tasks
. Rust не отслеживает эти вещи через границы функций, поэтому вам нужно разделить все остальные переменные-члены и передать их отдельно для функции.
См. Также:
Ограничение относится к упрощенному синтаксису CommonJS по сравнению с обычным синтаксисом обратного вызова:
Загрузка модуля по сути является асинхронным процессом из-за неизвестного времени его загрузки. Однако RequireJS в эмуляции серверной спецификации CommonJS пытается дать вам упрощенный синтаксис. Когда вы делаете что-то вроде этого:
var foomodule = require('foo');
// do something with fooModule
То, что происходит за кулисами, заключается в том, что RequireJS смотрит на тело вашего функционального кода и анализирует, что вам нужно «foo» и загрузить его до вашей функции выполнение. Однако, когда переменная или что-то иное, чем простая строка, например ваш пример ...
var module = require(path); // Call RequireJS require
... then Require не может разобрать это и автоматически преобразовать его. Решение состоит в том, чтобы преобразовать в синтаксис обратного вызова;
var moduleName = 'foo';
require([moduleName], function(fooModule){
// do something with fooModule
})
Учитывая вышеизложенное, рассмотрим один из возможных вариантов повторного использования вашего второго примера для использования стандартного синтаксиса:
define(['dyn_modules'], function (dynModules) {
require(dynModules, function(){
// use arguments since you don't know how many modules you're getting in the callback
for (var i = 0; i < arguments.length; i++){
var mymodule = arguments[i];
// do something with mymodule...
}
});
});
EDIT : Из вашего собственного ответа, я вижу, вы используете underscore / lodash, поэтому использование _.values
и _.object
может упростить цикл с использованием массива аргументов, как указано выше.
Отвечая на вопрос. С сайта RequireJS:
//THIS WILL FAIL
define(['require'], function (require) {
var namedModule = require('name');
});
Это не работает, потому что requirejs обязательно должен загружать и выполнять все зависимости до вызова заводской функции выше. [...] Итак, либо не проходите в массиве зависимостей, либо, если используете массив зависимостей, перечислите все зависимости в нем.
Мое решение:
// Modules configuration (modules that will be used as Jade helpers)
define(function () {
return {
'moment': 'path/to/moment',
'filesize': 'path/to/filesize',
'_': 'path/to/lodash',
'_s': 'path/to/underscore.string'
};
});
Загрузчик:
define(['jade', 'lodash', 'config'], function (Jade, _, Config) {
var deps;
// Dynamic require
require(_.values(Config), function () {
deps = _.object(_.keys(Config), arguments);
// Use deps...
});
});