Ruby 高端红宝石。如何在运行时提供数量可变的菜单选项

Ruby 高端红宝石。如何在运行时提供数量可变的菜单选项,ruby,highline,Ruby,Highline,我的第一个堆栈溢出帖子。我应该简明扼要,但是第一次请允许我介绍一些背景知识。我已经用C和VisualBasic编程16年了,但只是兼职来支持我作为科学家的工作。大约一年前开始学习ruby,并且非常喜欢它。我正在写一个处理数据的程序。这适用于文件夹和文件,而不是数据库。每当我陷入困境时,我总能在这里(多么棒的资源!)或谷歌上找到解决方案。这次不同了。说到这里: 我想使用ruby中的highline gem来显示一个菜单项数量可变的菜单。 基本上,我希望用户选择一个目录。父目录中可以有任意数量的目录

我的第一个堆栈溢出帖子。我应该简明扼要,但是第一次请允许我介绍一些背景知识。我已经用C和VisualBasic编程16年了,但只是兼职来支持我作为科学家的工作。大约一年前开始学习ruby,并且非常喜欢它。我正在写一个处理数据的程序。这适用于文件夹和文件,而不是数据库。每当我陷入困境时,我总能在这里(多么棒的资源!)或谷歌上找到解决方案。这次不同了。说到这里:

我想使用ruby中的highline gem来显示一个菜单项数量可变的菜单。 基本上,我希望用户选择一个目录。父目录中可以有任意数量的目录。我的代码如下:

@allArchiveDirs =  Dir.entries(@dirArchive).select {|entry| File.directory? File.join(@dirArchive,entry) and !(entry =='.' || entry == '..') }
p @allArchiveDirs

choose do |menu|
  menu.prompt = 'Please choose a project to access:'
  temp = @allArchiveDirs.map &:to_sym
  # todo here. Cannot get temp into correct format for choices call.
  temp = temp.map{|x| x.inspect}.join(', ')
  p temp
  menu.choices(:old1, :old5) do |chosen|
    puts "Item chosen: #{chosen}"
  end
end
在menu.choices调用的括号中,我通常会有temp,但目前我有:old1,:old5只是为了我自己的调试目的,否则我会得到一个错误

输出为:

[“deletemetest”、“old2”、“old3”、“old4”、“TestData”、“testy123”、“tsty”]

“:deletemetest,:old2,:old3,:old4,:TestData,:testy123,:tsty”

  • 旧的
  • 旧的
  • 请选择要访问的项目:


    因此,符号似乎是一个字符串(考虑到它周围的引号)。如果我可以删除这些,我可能会成功地将temp转换为menu.choice调用的正确格式。

    您实际上不需要进行所有类型转换,只需要splat操作符

    @allArchiveDirs = ["deletemetest", "old2", "old3", "old4", "TestData", "testy123", "tsty"]
    choose do |menu|
      menu.prompt = 'Please choose a project to access:'
       menu.choices(*@allArchiveDirs) do |chosen|
        puts "Item chosen: #{chosen}"
      end
    end
    
    输出:

    1. deletemetest
    2. old2
    3. old3
    4. old4
    5. TestData
    6. testy123
    7. tsty
    Please choose a project to access:
    

    你能给我们一个
    @allArchiveDirs
    的输出样本吗?我在代码p@allArchiveDirs中有一行。因此,输出在post中。它是“输出为:”之后的第一行。这是一个字符串数组,稍后我将其映射到符号以创建单个字符串。非常好,我只需要显示一个变量。我将详细了解splat现在的工作。似乎允许可变数量的参数,但现在将在线查看更多示例以了解其工作原理。正如您所指出的,现在不需要所有其他类型转换行。谢谢你,安东尼。这很有效,但我真的不明白怎么做。高端gem中menu.choices的参数必须为:符号。Splatting似乎列出了一个字符串列表,每个字符串后面都有回车符。看不到任何符号。。。。但它仍然可以工作……splat操作符解压传递给函数的数组,以便每个元素作为单个参数发送给函数。