Неоднозначность в разрешении имен классов Ruby

Вы могли бы создать 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();
3
задан Sean 18 January 2019 в 20:04
поделиться

2 ответа

Как правило, там, где есть неоднозначность, вы указываете полные пути к пространствам имен:

module Foo
  module Bar
    class SubUser < Foo::Bar::User; end
  end
end

Это может показаться многословным, но оно также специфично и однозначно.

Если вы хотите обратиться к буквальному верхнему уровню User, вы бы указали ::User.

0
ответ дан tadman 18 January 2019 в 20:04
поделиться

Модули идентифицируются константами. 1 Таким образом, разрешение поиска модулей определяется процедурой поиска константных ссылок. По словам "Ruby Programming Language", Дэвид Фланаган и Юкихеро Мацумото, 1-е изд. 2008 (стр. 261-262), поиск констант выполняется в следующем порядке, где mod - самый внутренний модуль, который включает ссылку на константу:

  • mod. [ 1118]
  • следующий включающий модуль, продолжающийся до тех пор, пока не останется никаких включающих модулей. (Верхние / глобальные константы на этом этапе не рассматриваются). Метод класса Module :: nesting возвращает массив модулей, в которых выполняется такой поиск, в порядке их поиска.
  • элементы из mod.ancestors, в порядке индекса (то есть иерархии наследования).
  • Определения констант верхнего уровня.
  • значение, возвращаемое методом Module # const_missing , где 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 Так как классы являются модулями, всякий раз, когда я ссылаюсь на «модуль» ниже, я имею в виду классы, а также модули, которые не являются классами.

0
ответ дан Cary Swoveland 18 January 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: