def
внутри другого def
или defn
. Использование def
является глобальным объявлением, и оно должно (почти) всегда стоять отдельно в исходном файле. См. Clojure for Brave & amp; Правда для вступления онлайн или многих хороших книг, таких как Getting Clojure
.
case
: Пример:
(case args ...)
case
действительно специальная функция, предназначенная в первую очередь для Java-объект взаимодействует и имеет некоторые серьезные ограничения (так называемые «оптимизации»). ИМХО почти всегда лучше использовать cond
. Пример:
(cond
(= :set-name args) (person (first args) age)
(= :set-age args) (person age)
...)
Одна из проблем с case
заключается в том, что он должен быть литералом времени компиляции ]. Тем не менее, это не очевидно, и нет никакого предупреждения, если вы пытаетесь использовать что-то, что не соответствует определению. Тогда вы просто получаете молчаливый сбой. Этот пример выглядит так, как будто он должен вернуть "my vec"
, но он терпит неудачу & amp; возвращает "default"
:
; "The test-constants are not evaluated. They must be compile-time
; literals, and need not be quoted."
(let [myvec [1 2]]
(case myvec
[] "empty vec"
(vec '(1 2)) "my vec"
"default"))
;=> "default"
Таким образом, использование case
оставляет ловушку-ловушку, готовую взломать ваш код без предупреждения.
Если у вас нет хэш-таблицы, которую вы создаете при построении массива, я не понимаю, как вы собираетесь создать функцию поиска, которая будет быстрее, чем O (n) решение, которое вы опубликовали. В любом случае, пока вы строите свои массивы, вы можете сделать что-то вроде этого:
<cfloop query="qryValues">
<cfset nameValues[name] = currentrow />
<cfset myArray[currentrow].name = name />
</cfloop>
<cfset arrayIndex = nameValues["WhatImLookingFor"] />
Это предполагает, что значение всегда существует. Перед вызовом может потребоваться проверить StructKeyExists (nameValues, «WhatImLookingFor»).
Without looking at it too deeply, I would consider converting the structure to a query (below) and then doing do a query of a query.. assuming your dataset isn't too huge!
http://www.bennadel.com/blog/264-Ask-Ben-Converting-A-Struct-To-A-Query-And-More-Java-.htm
Do share what you ended up doing!
Edit: The StructFindValue suggested looks to be excellent as well, I didn't think to look up any relevant functions.
CFGroovy FTW! :)
<cfset count = 0>
<g:script>
count = myArray.find({
it["NAME"] == "WhatImLookingFor" }
})
</g:script>
или .. если вам больше нравится стиль java (без закрытия)
<cfset count = 0>
<g:script>
for (i in myArray) {
if( i["NAME"] == "WhatImLookingFor" )
count++
}
</g:script>
You either want to use StructFindValue or StructFindKey