GAC может также использоваться блоками, которые требуют поднятых полномочий выполнить привилегированные операции от имени менее доверяемого кода (например, частичное доверительное приложение ASP.NET).
, Например, скажите, что у Вас есть частичное доверительное приложение ASP.NET, которое должно выполнить задачу, которая потребовала бы поднятых полномочий, т.е. Полное Доверие . Решение состоит в том, чтобы поместить код, который требует поднятых полномочий в отдельный блок. Блок отмечен с эти AllowPartiallyTrustedCallers
атрибут и класс, который содержит привилегированную логику, отмечен с атрибутом PermissionSet, чем-то вроде этого:
[PermissionSet(SecurityAction.Assert, Unrestricted=true)]
Нашему блоку дали бы поставленную строгую подпись и затем развернутую в GAC.
Теперь наше частично доверяемое приложение (приложения) может использовать доверяемый блок в GAC для выполнения определенного и узкого набора привилегированных операций, не теряя преимущества частичного доверия.
Вот мой вывод:
Есть много основных функций clojure, которые принимают последовательности в качестве аргументов, в то время как другие принимают несколько аргументов, поэтому, на мой взгляд, настоящего идиоматического способа не существует. Если у вас уже есть данные в последовательности, я бы использовал в качестве аргумента seq, поскольку он избавит вас от вызова для применения.
Я бы не стал писать функцию, которая в некоторых случаях возвращает значение и список значений в других случаях, потому что вызывающий код всегда должен будет проверять возвращаемое значение перед его использованием. Вместо этого я бы вернул одиночный режим как seq только с одним элементом в нем. Но у вас могут быть свои причины, в зависимости от кода, вызывающего эту функцию.
Кроме того, я бы переписал функцию режима так:
(defn mode [aseq]
(let [amap (tally-map aseq)
mx (apply max (vals amap))
modes (map key (filter #(= mx (val %)) amap))
c (count modes)]
(cond
(= c 1) (first modes)
(= c (count amap)) nil
:default modes)))
Вместо определения функции f вы можете использовать функцию идентификации (если ваши данные не содержат значений, которые логически ложны). Но тебе это даже не нужно. Я нахожу режимы другим способом, который мне удобнее читать: карта amap действует как последовательность записей карты (пары ключ-значение). Сначала я фильтрую только те записи, которые имеют значение mx. Затем я сопоставляю им функции клавиш, давая мне последовательность клавиш.
Чтобы проверить, есть ли какие-либо режимы, я больше не перебираю карту. Вместо этого я просто сравниваю количество режимов с количеством записей на карте. Если они равны, все элементы имеют одинаковую частоту!
Вот функция, которая всегда возвращает seq:
(defn modes [aseq]
(let [amap (tally-map aseq)
mx (apply max (vals amap))
modes (map key (filter #(= mx (val %)) amap))]
(when (< (count modes) (count amap)) modes)))
На мой взгляд, отображение некоторой функции над коллекцией с последующим немедленным сжатием списка до одного элемента является признаком использования reduce
.
(defn tally-map [coll]
(reduce (fn [h n]
(assoc h n (inc (h n 0))))
{} coll))
В этом случае я Я бы написал mode
fn, чтобы принимать единственную коллекцию в качестве аргумента, как вы это сделали. Единственная причина, по которой я могу придумать использование нескольких аргументов для такой функции, - это если вы планируете вводить много буквальных аргументов.
Так что, если, например, это для интерактивного сценария REPL, и вы часто будете набрав буквально (mode [1 2 1 2 3])
, тогда вы должны заставить функцию принимать несколько аргументов, чтобы избавить вас от постоянного ввода лишнего []
в вызове функции. Если вы планируете читать много чисел из файла, а затем использовать режим этих чисел, затем пусть функция принимает единственный аргумент, который представляет собой коллекцию, чтобы вы могли избавиться от постоянного использования apply
. Я предполагаю, что ваш самый распространенный вариант использования - это последний. Я считаю, что apply
также добавляет накладные расходы, которых вы избегаете, когда у вас есть вызов функции, который принимает аргумент коллекции.
Я согласен с другими, что вы должны иметь mode
возвращать список результатов даже если есть только один; это облегчит тебе жизнь. Возможно, переименуйте его в режимы
, пока вы на нем.
Я согласен с другими, что у вас должен быть режим
, возвращающий список результатов, даже если он только один; это облегчит тебе жизнь. Возможно, переименуйте его в режимы
, пока вы на нем.
Я согласен с другими, что у вас должен быть режим
, возвращающий список результатов, даже если он только один; это облегчит тебе жизнь. Возможно, переименуйте его в режимы
, пока вы на нем.
Похоже мне хорошо. Я бы заменил
f (fn [x] (not (nil? x)))
mode (filter f (map #(if (= mx (get amap %)) %) k))
на
mode (remove nil? (map #(if (= mx (get amap %)) %) k))
(я не знаю, почему чего-то вроде not-nil?
нет в clojure.core
; это то, что нужно каждому день.)
Если существует единственный уникальный режим, он возвращается. Если существует несколько режимов, они возвращаются в виде списка. Если режима нет, то есть все элементы присутствуют с одинаковой частотой, возвращается nil. "
Вы можете подумать о том, чтобы просто возвращать seq каждый раз (один элемент или пустой - это нормально); в противном случае необходимо учитывать случаи отличается вызывающим кодом. Всегда возвращая seq,