Как да получа списък на аргументите, предадени на метод, за предпочитане такъв, през който мога да повторя?
Например нещо подобно
def foo(a,b,c)
puts args.inspect
end
foo(1,2,3)
=> [1,2,3]
? Благодаря!
Отговори:
3 за отговор № 1Винаги можете да определите метод, който взема произволен брой аргументи:
def foo(*args)
puts args.inspect
end
Това прави точно това, което искате, но работи само върху методи, дефинирани по такъв начин.
Най- *args
нотация означава "нула или повече аргументи" в този контекст. Обратното на това е операторът на splat, който ги разширява обратно в списък, полезен за извикване на други методи.
Като бележка, *
-опционалните аргументи трябва да са последни в списъка с аргументи.
3 за отговор № 2
Ако дефинирате метода си, както сте посочили, винаги ще имате 3 арга или повикването на метода е невалидно. Така че "всички аргументи" вече са дефинирани за вас. Така че просто ще промените метода си на:
def foo(a,b,c)
[a, b, c]
end
За да дефинирате метод, който може да бъде извикан с всякакви аргументи (и след това да получите достъп до тях) можете да направите нещо подобно:
def foo(*args)
args
end
Какво *
прави, че поставя всички аргументи след тази точка в масив.
2 за отговор № 3
Както посочиха други, можете да използвате оператора за пръскане (*
) за постигане на това, което искате. Ако не го правите, можете да използвате факта, че методите на Ruby могат да вземат хеш като последен аргумент с по-хубав синтаксис.
def foo(args)
raise ArgumentError if args.keys.any? { |arg| arg.nil? || !arg.kind_of?(Integer) }
end
puts foo(:a => 1, :b => 2, :c => "a") # raise an ArgumentError
За достъп до аргументите вътре в метода, който трябва да използвате args[:a]
и т.н.