元数

元数定义了选项解析需要多少个参数。

与使用annotationprogrammatic的元数设置相比,legacy annotation存在局限性。这些在下面的示例中的注释中提到。
  • 程序化

  • 注解

  • 旧式注解

CommandRegistration zeroOrOne() {
	return CommandRegistration.builder()
		.command("example")
		.withOption()
			.longNames("arg")
			.arity(OptionArity.ZERO_OR_ONE)
			.and()
		.build();
}
@Command(command = "example")
String zeroOrOne(
	@Option(arity = OptionArity.ZERO_OR_ONE) String arg)
{
	return String.format("Hi '%s'", arg);
}
@ShellMethod(key = "example")
String zeroOrOne(
	@ShellOption(arity = 1) String arg)
{
	return String.format("Hi '%s'", arg);
}
表 1. OptionArity
最小值/最大值

ZERO

0 / 0

ZERO_OR_ONE

0 / 1

EXACTLY_ONE

1 / 1

ZERO_OR_MORE

0 / 整数最大值

ONE_OR_MORE

1 / 整数最大值

legacy annotation不支持定义最小元数。
  • 程序化

  • 注解

  • 旧式注解

CommandRegistration zeroOrOneWithMinMax() {
	return CommandRegistration.builder()
		.command("example")
		.withOption()
			.longNames("arg")
			.arity(0, 1)
			.and()
		.build();
}
@Command(command = "example")
String zeroOrOneWithMinMax(
	@Option(arityMin = 0, arityMax = 1) String arg)
{
	return String.format("Hi '%s'", arg);
}
@ShellMethod(key = "example")
String zeroOrOneWithMinMax(
	@ShellOption(arity = 1) String arg)
{
	return String.format("Hi '%s'", arg);
}

在下面的示例中,我们有选项*arg1*,它被定义为*String[]*类型。元数定义了它至少需要 1 个参数,最多需要 2 个参数。如下面的特定异常所示,会抛出*TooManyArgumentsOptionException*和*NotEnoughArgumentsOptionException*来指示元数不匹配。

shell:>e2e reg arity-errors --arg1
Not enough arguments --arg1 requires at least 1.

shell:>e2e reg arity-errors --arg1 one
Hello [one]

shell:>e2e reg arity-errors --arg1 one two
Hello [one, two]

shell:>e2e reg arity-errors --arg1 one two three
Too many arguments --arg1 requires at most 2.