/ / Как да получите списък с аргументите, с които се нарича метод - ruby-on-rails, ruby

Как да получите списък на аргументите, които се наричат ​​метод - рубинки, рубин

Как да получа списък на аргументите, предадени на метод, за предпочитане такъв, през който мога да повторя?

Например нещо подобно

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] и т.н.