Вы могли бы создать Stack, например:
function Stack() {
let items = [];
let maxIndex = -1;
this.isEmpty = () => {
return maxIndex === -1;
};
this.push = (item) => {
(items.length > ++maxIndex) ? (items[maxIndex] = item) : items.push(item);
};
this.pop = () => {
return (maxIndex >= 0) ? items[maxIndex--] : undefined;
};
this.top = () => {
return (maxIndex >= 0) ? items[maxIndex] : undefined;
}
}
, а затем нажимать элементы всякий раз, когда вы добавляете div
:
function addDay(S) {
// For loop to create 10 div elements.
for (k = 1; k < 11; k++) {
let div = document.createElement("div");
div.setAttribute("class", "studentGrades")
div.className += " sgID" + k
div.setAttribute("onclick", "userInput(this, Number(prompt('Please, enter
number here')))");
div.innerHTML = "0";
document.querySelector("#container3").appendChild(div);
S.push(div);
}}
и всплываете всякий раз, когда вы удаляете item, здесь мы просто удаляем все элементы из стека:
function removeDay(S) {
var itemToRemove;
while (itemToRemove = S.pop()) itemToRemove.remove();
}}
Естественно, где-то вам нужно будет создать стек каким-то образом, например:
let S = new Stack();
Как правило, там, где есть неоднозначность, вы указываете полные пути к пространствам имен:
module Foo
module Bar
class SubUser < Foo::Bar::User; end
end
end
Это может показаться многословным, но оно также специфично и однозначно.
Если вы хотите обратиться к буквальному верхнему уровню User
, вы бы указали ::User
.
Модули идентифицируются константами. 1 sup> Таким образом, разрешение поиска модулей определяется процедурой поиска константных ссылок. По словам "Ruby Programming Language", Дэвид Фланаган и Юкихеро Мацумото, 1-е изд. 2008 (стр. 261-262), поиск констант выполняется в следующем порядке, где mod
- самый внутренний модуль, который включает ссылку на константу:
mod
. [ 1118] mod.ancestors
, в порядке индекса (то есть иерархии наследования). mod
- получатель, а константа, выраженная в виде символа - аргумент, при условии, что метод был определен. Давайте посмотрим, что мы можем узнать, вставив операторы puts Module.nesting.inspect
и puts ancestors
в код.
module Foo
class UserBar
puts "nesting for UserBar=#{Module.nesting.inspect}"
puts "#{self}.ancestors=#{ancestors}"
end
end
# nesting for UserBar=[Foo::UserBar, Foo]
# Foo::UserBar.ancestors=[Foo::UserBar, Object, Kernel,
# BasicObject]
module Foo
class SubUserBar < UserBar
puts "nesting for SubUserBar=#{Module.nesting.inspect}"
puts "#{self}.ancestors=#{ancestors}"
end
end
# nesting for SubUserBar=[Foo::SubUserBar, Foo]
# Foo::SubUserBar.ancestors=[Foo::SubUserBar,
# Foo::UserBar, Object, Kernel, BasicObject]
module Foo
module Bar
class User
puts "nesting for User=#{Module.nesting.inspect}"
puts "#{self}.ancestors=#{ancestors}"
end
end
end
# nesting for User=[Foo::Bar::User, Foo::Bar, Foo]
# Foo::Bar::User.ancestors=[Foo::Bar::User, Object, Kernel,
# BasicObject]
module Foo
module Bar
class SubUser < User
puts "nesting for SubBar=#{Module.nesting.inspect}"
puts "#{self}.ancestors=#{ancestors}"
end
end
end
# nesting for SubBar=[Foo::Bar::SubUser, Foo::Bar, Foo]
# Foo::Bar::SubUser.ancestors=[Foo::Bar::SubUser,
# Foo::Bar::User, Object, Kernel, BasicObject]
Это говорит нам о том, что если существует класс User
, который не содержится в Foo
(как в Rails), этот класс будет предмет ссылок на User
в классах Foo::UserBar
и Foo::SubUserBar
, но не в Foo::Bar::User
или Foo::Bar::SubUser
. Это понимание должно помочь в организации модулей, чтобы избежать проблем с пространством имен.
1 Так как классы являются модулями, всякий раз, когда я ссылаюсь на «модуль» ниже, я имею в виду классы, а также модули, которые не являются классами. Sup>