/ / Ruby vorbei an vielen Args - Ruby

Ruby mit vielen Argumenten - Ruby

Ich habe eine Methode, die ungefähr 20 Argumente erhält,In diesem Argument möchte ich alle an eine andere Methode übergeben. Kann ich sie alle an die zweite Methode übergeben, ohne sie alle neu einzugeben? Gibt es ein Argument Array oder etwas, das ich übergeben kann?

Was ich habe:

def my_method(arg1, arg2, ..., arg20)
#do some stuff
my_second_method(arg1, arg2, ..., arg20)
#do other stuff
end

Was ich gerne hätte:

def my_method(arg1, arg2, ..., arg20)
#do some stuff
my_second_method(args[array])
#do other stuff
end

Antworten:

8 für die Antwort № 1

Eine Methode haben, die so viele Argumente akzeptiert ist ein Codegeruch. Diese Methode versucht fast sicher, zu viele Dinge mit zu vielen verschiedenen Arten von Daten auszuführen.

Wenn dies nicht zu vermeiden ist, versuchen Sie es mit dem Splat-Operator von Ruby.

  def one(*args)
# process/validate args
two(*args)     # Note that the splat is needed here too.
end

def two(*args)
# do work
end

5 für die Antwort № 2

Sie können den Splat-Operator von Ruby verwenden:

def my_method(*args)
# do some stuff
my_second_method(*args)
# do other stuff
end

def my_second_method(*args)
# use args[0] through args[19]
end

3 für die Antwort № 3

Dies ist möglicherweise nicht die beste Idee, aber nachdem Sie das gesagt haben, können Sie einen Hash verwenden, um Argumente zu verwalten.

Rails macht das viel:

render :partial => "new", :locals => {:object => @my_object}

Rubys ActiveSupport hat eine Möglichkeit, damit umzugehen extract_options! Funktion, die detailliert auf simone carlettis Blog


0 für die Antwort № 4
def as_array(*args)
if args.length == 3
a, b, c = args
puts "a=#{a} b=#{b} c=#{c}"
end
end


as_array 1, 2, 3

0 für die Antwort № 5

Es gibt eine gemeinsame Redewendung, die Sie oft in Ruby-Code sehen können:

def method1(*args)
method2(*args)
end

def method2(*args)
end

method1(a, b, c, d, e, f, g)

Beachten Sie, wie die splat Operator wird verwendet. Es packt die Argumente grundsätzlich zuerst in ein Array und entpackt sie dann beim Methodenaufruf wieder in die einzelnen Argumente. Das ist sehr praktisch, wenn Sie die Argumente nur an eine andere Methode weitergeben müssen, z. B. in einem Initialisierer.