ユーゲンはすでに答えました、なぜそれが機能しないのですか?
ただし、おそらく次の回避策が役立つ場合があります。
task :test_commas, :arg1, :arg2 do |t, args|
arg = args.to_hash.values.join(',')
puts "Argument is #{arg.inspect}"
end
2つの引数を取りますが、それらを結合して「実際の」引数を取得します。
カンマが複数ある場合は、さらに多くの引数が必要です。
私はいくつかのより深い調査を行い、1つ(または2つ)の解決策を見つけました。完璧な解決策ではないと思いますが、うまくいくようです。
require 'rake'
module Rake
class Application
#usage:
# rake test_commas[1\,2\,3]
def parse_task_string_masked_commas(string)
if string =~ /^([^\[]+)(\[(.*)\])$/
name = $1
args = $3.split(/\s*(?<!\\),\s*/).map{|x|x.gsub(/\\,/,',')}
else
name = string
args = []
end
[name, args]
end
#Usage:
# rake test_commas[\"1,2\",3]
#" and ' must be masked
def parse_task_string_combined(string)
if string =~ /^([^\[]+)(\[(.*)\])$/
name = $1
args = $3.split(/(['"].+?["'])?,(["'].+?["'])?/).map{|ts| ts.gsub(/\A["']|["']\Z/,'') }
args.shift if args.first.empty?
else
name = string
args = []
end
[name, args]
end
#~ alias :parse_task_string :parse_task_string_masked_commas
alias :parse_task_string :parse_task_string_combined
end
end
desc 'Test comma separated arguments'
task :test_commas, :arg1 do |t, args|
puts '---'
puts "Argument is #{args.inspect}"
end
このバージョンparse_task_string_masked_commas
では、マスクされたコンマを使用した呼び出しが許可されています。
rake test_commas[1\,2\,3]
バージョンでは、次のparse_task_string_combined
ことが可能です。
rake test_commas[\"1,2,3\"]
少なくともウィンドウでは、 "(または')をマスクする必要があります。マスクしない場合、文字列がRake :: Aplication(おそらくシェル置換)に到達するまで、それらはすでに削除されています。