Единственное время я использую структуру вместо класса, при объявлении функтора прямо перед использованием его в вызове функции, и хотят минимизировать синтаксис ради ясности. например:
struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare());
Ключ к помните, что Dynamic ничего не контролирует напрямую. Что он делает, так это создает на экране место, которое имеет свойства оценки.
Если, например, вы должны были оценить следующее в новой системе Mathematica сессия ...
b=5;
Dynamic[a=b];
b=6;
Print[a];
... что тогда будет печататься? Вместо того, чтобы сразу оценивать это, подумайте о это перед тем, как попробовать. Подсказка ... это вопрос с подвохом, но понимание хитрости откроет ваш разум для того, что именно делает Dynamic.
Ответ, который я не буду раскрывать здесь (потому что вам действительно стоит попробовать это для себя!) можно объяснить тем, что Dynamic никогда ничего не делал потому что он никогда не появлялся на экране. Точка с запятой подавляла отображение на экране внешний вид Dynamic, и без отображения на экране оценка Dynamic ничего не дает.
Более тонко, если вы удалите все точки с запятой, оператор Print [] (at по крайней мере, на моей машине) по-прежнему остается без изменений, но теперь полностью другая причина. Это потому, что размещение Dynamic на экране гарантирует что его содержимое будет оцениваться, но не , когда оно будет оцениваться. Мой пример устанавливает состояние гонки, которое, по крайней мере, на моей машине в версии 7, Shift + Enter оценка побеждает.
Возвращаясь к вашему примеру,
Select[Range[1, 20], # > Dynamic[q] &]
Это не работает так, как вы думаете, потому что Dynamic в этом случае не оценивает то, что отображается на экране.
Вы могли бы тривиально продемонстрировать результат, выполнив ...
Dynamic[Select[Range[1, 20], # > q &]]
но я предполагаю, что вы были заинтересованы не только в отображении его на экране, но в установке какого-то побочного эффекта. Возможно, вы назначали Select переменной. Есть два способа вызвать эти побочные эффекты. Один - поместить их в второй аргумент Dynamic. Например ...
findset[x_] := (myset = Select[Range[1, 20], # > x &])
Slider[Dynamic[q, (q=#; myset = findset[q])&], {1, 20}]
Второй - создать динамический, который действительно отображается на экране, но один что не заметно. Например,
Row[{
Slider[Dynamic[q], {1, 20}],
Dynamic[myset = Select[Range[1, 20], # > q &]; ""]
}]
В этом случае фактически отображается динамический. Он отображается рядом с Слайдер. Но вы его не видите, потому что он отображает пустую строку. Тем не менее, у него есть все свойства автоматического обновления, которые есть у любого Dynamic.
Для получения дополнительной информации вы должны прочитать начальные и расширенные учебные пособия по Dynamic. в документации Mathematica. Вы также можете увидеть мой пост на comp.soft-sys.math.mathematica здесь (который я частично переформулировал для этого ответа).
Думаю, вы хотите убрать из выбора "Динамический". Кажется, это работает, когда я играю с ним:
In[20]:= x = 5
Out[20]= 5
In[21]:= Slider[Dynamic[x], {1, 20}]
Out[21]= \!\(\*
SliderBox[Dynamic[$CellContext`x], {1, 20}]\)
In[26]:= (*manually move the slider a bit to the right *)
In[23]:= x
Out[23]= 9.36
In[24]:= Select[Range[1, 20], # > x &]
Out[24]= {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
x = 2 (*slider moves left when I set this*)
Out[25]= 2
РЕДАКТИРОВАТЬ: Ваш фактический вопрос был «почему это не работает» вместо «как мне заставить это работать». Вот проблема:
In[12]:= q = 3
Out[12]= 3
In[13]:= (# > q) &[10]
Out[13]= True
In[14]:= (# > Dynamic[q]) &[10]
(* what you see on the screen looks like an evaluation that is held or something *)
Out[14] = 10 > 3
(* but the full form, which is conveniently what gets copied to the clipboard for
pasting into this answer, is actually this! *)
Out[14]= 10 > \!\(\*
DynamicBox[ToBoxes[$CellContext`q, StandardForm],
ImageSizeCache->{7., {1., 8.}}]\)
Итак, если вы скажете «Динамический [1]», вы получите на экране цифру «3», но на самом деле это не «3» - это какой-то элемент записной книжки, который фактически отображает a '3'.
Результатом функции сравнения является выражение, подобное приведенному выше, которое не оценивается как True, поэтому select не принимает никаких элементов, поэтому вы получаете пустой набор.
Вы хотите, чтобы все исходное выражение Select
было динамическим, потому что вы хотите обновлять выбранное подмножество при изменении значения q
. Это можно сделать, переместив Dynamic
наружу. Попробуйте следующее:
Slider[Dynamic[q], {1, 20}]
Dynamic[Select[Range[1, 20], # > q &]]