如何用Ruby和Thor分割参数?

时间:2011-12-12 10:46:20

标签: ruby-on-rails ruby code-generation thor

我一直在学习Ruby并在自我项目中使用Thor,我想知道,如何使用Thor分割参数。例如:

scaffold Post name:string title:string content:text

我想知道如何将name:stringtitle:stringcontent:text拆分为具有“name”和“type”的对象数组。

3 个答案:

答案 0 :(得分:1)

考虑您有一个文件scaffold.rb,内容如下:

array = ARGV.map { |column_string| column_string.split(":").first }
puts array.inspect # or 'p array'

然后,如果我们运行ruby scaffold.rb name:string title:string content:text,您将获得

["name", "title", "content"]

如果我们的代码为p ARGV,则输出为["name:string", "title:string", "content:text"]。因此,我们将获得我们传递的任何内容,ruby scaffold.rb作为在代码内ARGV变量中的空格分割的数组。我们可以在代码中按照自己的意愿操作这个数组。

免责声明:我不认识Thor,但想表明如何在Ruby中完成这项工作

答案 1 :(得分:1)

我的建议是使用Rails使用的任何东西,这样你就不会重新发明轮子。我在生成器源中挖了一下,发现rails使用GeneratedAttribute类将参数转换为对象。

generator named_base来源,您会看到他们正在将参数拆分为':'并将其传递给Rails::Generators::GeneratedAttribute

def parse_attributes! #:nodoc:
  self.attributes = (attributes || []).map do |key_value|
    name, type = key_value.split(':')
    Rails::Generators::GeneratedAttribute.new(name, type)
  end
end

您不必使用GeneratedAttribute课程,但如果您需要,它就在那里。

答案 2 :(得分:-1)

"your:string:here".split(":") => ["your", "string", "here"]