Update docs

This commit is contained in:
Him188 2020-08-26 22:51:53 +08:00
parent 91b924ad11
commit f9ac26b3af
3 changed files with 36 additions and 11 deletions

View File

@ -39,7 +39,7 @@ import kotlin.reflect.full.findAnnotation
* *
* **注意**: [PluginData] 总应该是单例的. * **注意**: [PluginData] 总应该是单例的.
* *
* ### [JvmPlugin] 的实现方案 * ## [JvmPlugin] 的实现方案
* *
* 要修改保存时的名称, 请参考 [ValueName] * 要修改保存时的名称, 请参考 [ValueName]
* *
@ -50,10 +50,13 @@ import kotlin.reflect.full.findAnnotation
* object PluginMain : KotlinPlugin() * object PluginMain : KotlinPlugin()
* *
* object MyPluginData : AutoSavePluginData() { * object MyPluginData : AutoSavePluginData() {
* val list: MutableList<String> by value(mutableListOf("a", "b")) // mutableListOf("a", "b") 是初始值, 可以省略 * var list: MutableList<String> by value(mutableListOf("a", "b")) // mutableListOf("a", "b") 是初始值, 可以省略
* val custom: Map<Long, CustomData> by value() // 使用 kotlinx-serialization 序列化的类型. (目前还不支持) * val custom: Map<Long, CustomData> by value() // 使用 kotlinx-serialization 序列化的类型. (目前还不支持)
* var long: Long by value(0) // 允许 var * var long: Long by value(0) // 允许 var
* var int by value(0) // 可以使用类型推断, 但更推荐使用 `var long: Long by value(0)` 这种定义方式. * var int by value(0) // 可以使用类型推断, 但更推荐使用 `var long: Long by value(0)` 这种定义方式.
*
* // 将 MutableMap<Long, Long> 映射到 MutableMap<Bot, Long>.
* val botToLongMap: MutableMap<Bot, Long> by value<MutableMap<Long, Long>>().mapKeys(Bot::getInstance, Bot::id)
* } * }
* *
* @Serializable * @Serializable
@ -64,7 +67,7 @@ import kotlin.reflect.full.findAnnotation
* *
* 使用时, 可以方便地直接调用, : * 使用时, 可以方便地直接调用, :
* ``` * ```
* val theList = AccountPluginData.list * val theList: MutableList<String> = AccountPluginData.list
* ``` * ```
* *
* 但也注意, 不要存储 `AccountPluginData.list`. 它可能受不到值跟踪. 若必要存储, 请使用 [PluginData.findBackingFieldValue] * 但也注意, 不要存储 `AccountPluginData.list`. 它可能受不到值跟踪. 若必要存储, 请使用 [PluginData.findBackingFieldValue]
@ -73,8 +76,31 @@ import kotlin.reflect.full.findAnnotation
* *
* 参考 [JAutoSavePluginData] * 参考 [JAutoSavePluginData]
* *
* ## 非引用赋值
*
* 由于实现特殊, 赋值时不会写其引用. :
* ```
* val list = ArrayList<String>("A")
* MyPluginData.list = list // 赋值给 PluginData 的委托属性是非引用的
* println(MyPluginData.list) // "[A]"
*
* list.add("B")
* println(list) // "[A, B]"
* println(MyPluginData.list) // "[A]" // !! 由于 `list` 的引用并未赋值给 `MyPluginData.list`.
* ```
*
* 另一个更容易出错的示例:
* ```
* // MyPluginData.nestedMap: MutableMap<Long, List<Long>> by value()
* val newList = MyPluginData.map.getOrPut(1, ::mutableListOf)
* newList.add(1) // 不会添加到 MyPluginData.nestedMap 中, 因为 `mutableListOf` 创建的 MutableList 被非引用地添加进了 MyPluginData.nestedMap
* ```
*
* 一个解决方案是对 [SerializerAwareValue] 做映射或相关修改. [PluginDataExtensions]
*
* @see JvmPlugin.reloadPluginData 通过 [JvmPlugin] 获取指定 [PluginData] 实例. * @see JvmPlugin.reloadPluginData 通过 [JvmPlugin] 获取指定 [PluginData] 实例.
* @see PluginDataStorage [PluginData] 存储仓库 * @see PluginDataStorage [PluginData] 存储仓库
* @see PluginDataExtensions 相关 [SerializerAwareValue] 映射函数
*/ */
public interface PluginData { public interface PluginData {
/** /**

View File

@ -31,6 +31,9 @@ import kotlin.reflect.full.createType
* public static PluginMain INSTANCE; * public static PluginMain INSTANCE;
* public PluginMain() { * public PluginMain() {
* INSTANCE = this; * INSTANCE = this;
* }
* @Override
* public onLoad() {
* this.reloadPluginData(MyPluginData.INSTANCE); // 读取文件等 * this.reloadPluginData(MyPluginData.INSTANCE); // 读取文件等
* } * }
* } * }
@ -39,11 +42,6 @@ import kotlin.reflect.full.createType
* public class MyPluginData extends JAutoSavePluginData { * public class MyPluginData extends JAutoSavePluginData {
* public static final MyPluginData INSTANCE = new MyPluginData(); * public static final MyPluginData INSTANCE = new MyPluginData();
* *
* private MyPluginData() {
* super(PluginMain.INSTANCE);
* INSTANCE = this;
* }
*
* public final Value<String> string = value("test"); // 默认值 "test" * public final Value<String> string = value("test"); // 默认值 "test"
* *
* public final Value<List<String>> list = typedValue(createKType(List.class, createKType(String.class))); // 无默认值, 自动创建空 List * public final Value<List<String>> list = typedValue(createKType(List.class, createKType(String.class))); // 无默认值, 自动创建空 List
@ -60,9 +58,7 @@ import kotlin.reflect.full.createType
* 使用时, 需要使用 `.get()`, : * 使用时, 需要使用 `.get()`, :
* ``` * ```
* Value<List<String>> theList = MyPluginData.INSTANCE.list; // 获取 Value 实例. Value 代表一个追踪自动保存的值. * Value<List<String>> theList = MyPluginData.INSTANCE.list; // 获取 Value 实例. Value 代表一个追踪自动保存的值.
*
* List<String> actualList = theList.get(); * List<String> actualList = theList.get();
*
* theList.set(); * theList.set();
* ``` * ```
* *

View File

@ -59,7 +59,10 @@ internal abstract class AbstractReflectionCommand @JvmOverloads constructor(
internal var _usage: String = "<not yet initialized>" internal var _usage: String = "<not yet initialized>"
override val usage: String // initialized by subCommand reflection override val usage: String // initialized by subCommand reflection
get() = _usage get() {
subCommands // ensure init
return _usage
}
abstract suspend fun CommandSender.onDefault(rawArgs: Array<out Any>) abstract suspend fun CommandSender.onDefault(rawArgs: Array<out Any>)