Hvordan kan jeg sende flere argumenter til en rubin metode som en matrise?

stemmer
57

Jeg har en metode i en rails hjelper fil som dette

def table_for(collection, *args)
 options = args.extract_options!
 ...
end

og jeg ønsker å være i stand til å kalle denne metoden som dette

args = [:name, :description, :start_date, :end_date]
table_for(@things, args)

så at jeg kan dynamisk passere på argumentene basert på et skjema innlegging. Jeg kan ikke skrive om metoden, fordi jeg bruker det i altfor mange steder, hvordan kan jeg gjøre dette?

Publisert på 06/05/2009 klokken 18:41
kilden bruker
På andre språk...                            


3 svar

stemmer
53

Bare kalle det på denne måten:

table_for(@things, *args)

Den splat( *) Operatøren vil gjøre jobben, uten å måtte endre metoden.

Svarte 06/05/2009 kl. 19:11
kilden bruker

stemmer
80

Ruby håndterer flere argumenter godt.

Her er en ganske godt eksempel.

def table_for(collection, *args)
  p collection: collection, args: args
end

table_for("one")
#=> {:collection=>"one", :args=>[]}

table_for("one", "two")
#=> {:collection=>"one", :args=>["two"]}

table_for "one", "two", "three"
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", "two", "three")
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", ["two", "three"])
#=> {:collection=>"one", :args=>[["two", "three"]]}

(Output klippet og limt fra IRB)

Svarte 06/05/2009 kl. 19:23
kilden bruker

stemmer
-2
class Hello
  $i=0
  def read(*test)
    $tmp=test.length
    $tmp=$tmp-1
    while($i<=$tmp)
      puts "welcome #{test[$i]}"
      $i=$i+1
    end
  end
end

p Hello.new.read('johny','vasu','shukkoor')
# => welcome johny
# => welcome vasu
# => welcome shukkoor
Svarte 18/06/2015 kl. 09:30
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more