Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

函数

func parseArguments(Array<String>, Array<ArgumentSpec>)

public func parseArguments(args: Array<String>, specs: Array<ArgumentSpec>): ParsedArguments

功能:根据提供的参数规范 specs 解析命令行参数 args,返回一个结构化的对象,包含解析后的选项和非选项参数。

该函数将 args 中的每个参数与 specs 中定义的选项进行匹配。对于匹配成功的选项,它会将选项名称和对应的值加入到 options 中,未匹配的参数会被当作非选项参数处理,并添加到 nonOptions 中。此外,当解析到 -- 时,将提前终止选项扫描,其后的所有参数都将被视作非选项

该函数支持 短选项长选项短前缀长选项短选项组合非选项非法选项 的解析处理。

specs 的每个 ArgumentSpec 持有的 ArgumentMode 决定了参数的处理方式。

对于短选项组合的场景:

  • 当解析到第一个非 NoValue 的选项时:
    • 如果该选项为 OptionalValue,紧随选项后的内容若存在,则会被作为该选项的值来解析。
    • 如果该选项为 RequiredValue,紧随选项后的内容会被作为该选项的值来解析。
  • 如果一组短选项可以组合成长选项的字面值,那么视为长选项而非短选项组合,如 -abc 同时已定义了 abc 的长选项和 a b c 三个短选项,会被视作长选项解析。

如果 ArgumentSpec 提供了 lambda 回调函数,该回调会在解析成功后被调用,处理解析到的参数值。

如果传入的 args 存在对同一选项多次赋值的情况,则以最后一次的值作为该选项的值。

参数:

返回值:

异常:

示例:

import std.argopt.*

main(): Unit {
    // 定义参数规范
    let helpSpec = ArgumentSpec.Short(r'h', ArgumentMode.NoValue)
    let outputSpec = ArgumentSpec.Long("output", ArgumentMode.RequiredValue)
    let verboseSpec = ArgumentSpec.Short(r'v', ArgumentMode.OptionalValue)

    // 创建specs数组
    let specs = [helpSpec, outputSpec, verboseSpec]

    // 创建参数数组
    let args = ["-h", "--output", "output.txt", "file1.txt"]

    // 解析命令行参数
    let parsed = parseArguments(args, specs)

    // 输出解析结果
    println("选项:")
    let options = parsed.options
    for (key in options.keys()) {
        println("  ${key}: ${options[key]}")
    }

    println("非选项参数:")
    for (nonOption in parsed.nonOptions) {
        println("  ${nonOption}")
    }

    // 测试异常情况
    try {
        parseArguments(["-x", "value"], specs) // 未定义的选项
    } catch (e: ArgumentParseException) {
        println("捕获到异常: ${e.message}")
    }
}

可能的运行结果:

选项:
  h: 
  output: output.txt
非选项参数:
  file1.txt
捕获到异常: Unknown option: x.