Дом зеркал
Я написал эту игру в Scala. Он с открытым исходным кодом и использует Swing через интерфейсы библиотек Java и Scala.
Scala API прекрасно работает, как показано на иллюстрации oxbox_lakes. Я должен был использовать интерфейс Java только для определенного низкоуровневого управления, такого как пользовательская альфа-композиция.
До того, как библиотека Scala-swing стала стабильной, игра была основана на Scala-Squib , но этот проект приостановил AFAIK.
Это просто еще один делегат. Действие
объявляется так:
void Action<T>(T item)
Это просто «что-то, что действует на один элемент». Существуют общие перегрузки с большим количеством параметров типа и нормальных параметров. Само по себе Action
не является прикладной таблицей решений или чем-то в этом роде - это просто делегат, который может «что-то» делать с элементом.
Пример словаря - это просто словарь со значениями перечисления в качестве ключей и действиями как значениями - так что вы можете найти, что делать на основе значения перечисления, а затем передать ссылку пользователя
, чтобы он действовал.
Что касается Func
vs Action
vs Предикат
: Func
похож на Action
, но возвращает значение.
Action, Func и Predicate имеют разные сигнатуры:
void Action <...> (...)
T Func <..., T> (...)
bool Predicate
Action <...> совпадает с Func <..., void>
Предикат
1) Делегаты действия
(Action, Action<T>, Action<T, T2> ...)
являются делегатами общего назначения, чтобы избежать создания делегатов для многих в вашем приложении. Идея такова:
//- Action => void method with 0 args
//- Action<T> => void method with 1 arg of type T
//- Action<T, T2> => void method with 2 args of type T et T2
//...
2) что словарь хранит для каждого значения SomeEnum метод, соответствующий этой сигнатуре:
void MethodExample (User arg);
Вот пример:
public Init() {
deleteUserMethodsByStatus = new Dictionary<SomeEnum, Action<User>>();
deleteUserMethodsByStatus.Add(UserStatus.Active, user => { throw new BusinessException("Cannot delete an active user."); });
deleteUserMethodsByStatus.Add(UserStatus.InActive, DoUserDeletion});
}
//This is how you could use this dictionary
public void DeleteUser(int userId) {
User u = DaoFactory.User.GetById(userId);
deleteUserMethodsByStatus[u.Status](u);
}
//the actual deletion process
protected internal DoUserDeletion(User u) {
DaoFactory.User.Delete(u);
}
3) Разница между действием, функцией, предикатом: - действие является недействительным методом (без возвращаемого значения) - функция не является недействительным методом (имеет возвращаемое значение) - предикат должен возвращать логическое значение и принимать 1 аргумент (в основном он отвечает «да» или «нет» на вопросы, принимающие 1 аргумент)
Надеюсь, это поможет.