Как я выясняю, какое пространство имен я должен импортировать из библиотеки Java?

Я пишу некоторый clojure код, и я полагаюсь на время Joda в течение времени, обрабатывая. Проблема состоит в том, что я не знаю, что импортировать, и документация ужасно не соглашается с этим. Теперь я знаю, что кто-то здесь может, вероятно, дать мне корректный ответ меньше чем через 5 секунд, но я знал бы, как понять этого самостоятельно (кроме заливки через документы, пока я не нахожу корректный ответ).

Если бы я делал это в Python, то я импортировал бы пакет верхнего уровня и использовал бы комбинацию dir и help выяснять то, что я должен импортировать. Там какой-либо путь состоит в том, чтобы сделать это в clojure? Или есть ли какие-либо другие виды инструментов Java для понимания этого? Я предпочел бы что-то, что это - ориентированная командная строка.

7
задан Jason Baker 5 February 2010 в 14:54
поделиться

4 ответа

Обычно я бы выбрал ответ Дэвида Гранта, но если вы не можете найти JavaDoc (!), но у вас есть jar-файл, вы можете использовать утилиту jar, чтобы перечислить файлы в jar-файле.

Каталог, в котором находятся файлы класса, находится непосредственно на карте под именем пакета. Например, jar -tf joda-time-1.6.jar | more перечисляет DateTime.class как org/joda/time/DateTime.class; DateTime находится в пакете org.joda.time.

8
ответ дан 6 December 2019 в 21:13
поделиться

Подобно тому, как dir и help проверяют документацию пакетов на Python, полезную информацию на Java можно почерпнуть из чтения документации Javadocs для конкретного API. В случае Joda Time на веб-сайте есть прямая ссылка на созданную документацию, здесь:

http://joda-time.sourceforge.net/api-release/index.html (см. Внизу левый кадр)

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

3
ответ дан 6 December 2019 в 21:13
поделиться

вектор:

  • Непрерывная память.
  • Предварительно распределяет пространство для будущих элементов, поэтому требуется дополнительное пространство сверх того, что необходимо для самих элементов.
  • Для каждого элемента требуется только пространство для самого типа элемента (без дополнительных указателей).
  • Может повторно выделить память для всего вектора в любое время при добавлении элемента.
  • Вставки в конце являются постоянными, амортизированными временем, но вставки в другом месте являются дорогостоящим O (n).
  • Стирание в конце вектора является постоянным временем, но для остальных это O (n).
  • Вы можете получить случайный доступ к его элементам.
  • Итераторы становятся недействительными при добавлении или удалении элементов в вектор или из него.
  • Если требуется массив элементов, можно легко добраться до базового массива.

список:

  • несмежная память.
  • Нет предварительно выделенной памяти. Служебные данные памяти для самого списка являются постоянными.
  • Для каждого элемента требуется дополнительное пространство для узла, который содержит элемент, включая указатели на следующий и предыдущие элементы в списке.
  • Никогда не придется повторно выделять память для всего списка только потому, что вы добавляете элемент.
  • Вставки и стирания являются дешевыми независимо от того, где в списке они происходят.
  • Дешево комбинировать списки со сращиванием.
  • Случайный доступ к элементам невозможен, поэтому получение определенного элемента в списке может быть дорогостоящим.
  • Итераторы остаются действительными даже при добавлении или удалении элементов из списка.
  • Если вам нужен массив элементов, вам придется создать новый и добавить их все в него, так как нет базового массива.

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

-121--605695-

Интересный вопрос. Я бы сказал, что это невозможно вообще , но давайте посмотрим

Цитирование IBM - что нового в PHP5.3, Part 2

Замыкание - это функция, которая оценивается в собственной среде, которая имеет одну или несколько связанных переменных, которые могут быть доступны при вызове функции.

и далее (акцент мой)

Переменные, которые будут импортированы из внешней среды, указаны в предложении использования определения функции замыкания. По умолчанию они передаются значением , что означает, что если мы будем обновлять значение, переданное в определении функции замыкания, оно не будет обновлять внешнее значение.

Использование global будет проходить по ссылке, и хотя можно связать переменные по ссылке с закрытием с помощью и в предложении use , это уже является отклонением от 5,3 поведения по умолчанию.

$var = 'yes';
$fn  = create_function('', 'global $var; $var = "no";');
$fn();
echo $var; // outputs no

Можно скопировать глобальную переменную, чтобы использовать ее по значению, хотя, например,

$var = 'yes';
$fn  = create_function('', 'global $var; $tmp = $var; $tmp = "no";');
$fn();
echo $var; // outputs yes

Кроме того, значение глобальной переменной (при использовании create _ function ) не будет вычисляться (привязываться) при создании функции, но при выполнении функции

$var = 'yes';
$fn  = create_function('', 'global $var; $tmp = $var; return $tmp;');
$var = 'maybe';
echo $fn(); // outputs maybe

$var = 'yes';
$fn  = function() use ($var) { return $var; };
$var = 'maybe';
echo $fn(); // outputs yes

Также важно

При определении в объекте удобным является то, что закрытие имеет полный доступ к объекту через переменную $ this, без необходимости явно импортировать его. * Хотя я думаю, что это было отброшено в окончательном PHP5.3

Это невозможно с глобальным ключевым словом, и вы также не можете просто использовать $ это . Нет пути ссылаться на свойство из класса при определении тела функции с помощью create _ function .

class A {

    protected $prop = 'it works';

    public function test()
    {
        $fn = create_function('', 'echo $this->prop;');
        return $fn;
    }
}

$a = new A;
$fn = $a->test();
$fn();

приведет к

Fatal error: Using $this when not in object context

Для суммирования
В то время как вы можете создать функцию, импортирующую переменную из глобальной области, вы не можете создать ее с помощью переменных из другой области. И поскольку вы технически не привязываетесь при использовании create _ function , но импортируете при выполнении созданной функции, я хотел бы утверждать, что это ограничение делает закрытие лямбда .


EDIT: Решение, предложенное Онно Марсманом ниже, довольно приличное, хотя. Он не полностью имитирует закрытия, но реализация довольно близка.

-121--3338940-

Билл Клементсон написал небольшой фрагмент кода , который помогает просмотреть документацию javadoc из REPL.

1
ответ дан 6 December 2019 в 21:13
поделиться

Структуры также могут иметь конструкторы, поэтому можно сделать то же самое с ними, что и в примере класса.

-121--3320678-

Если вы специально делаете это на странице успешного завершения операции - в success.phtml - то код для получения идентификатора приращения заказа уже доступен в шаблоне, так как он отображается клиенту.

Вам просто нужно следующее:

$orderId = $this->getOrderId();

Обратите внимание, что это не будет работать на других страницах, поэтому для них вам необходимо использовать:

$orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId();
-121--1725332-

http://dishevelled.net/Generating-Clojure-import-lines-using-SLIME.html Делает очень легко искать импорт. Лично я просто использую функцию clojure find-classes, определенные там из REPL.

0
ответ дан 6 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

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