2012-01-27 8 views
5

Próbuję zrozumieć Ruby głębiej i czytał:Jakie są różne możliwości przekazywania parametrów w metody ruby? param/hashlist/array/aproc?

http://www.zenspider.com/Languages/Ruby/QuickRef.html#25

Ja jednak nie rozumiem, co się następujące środki w tej definicji:

parameters := ([param]* [, hashlist] [*array] [&aProc]) 

wiem "param" jest dowolna liczba określonych parametrów, a następnie zgubię to, co oznacza pozostała część?

Na przykład mam:

def doIt(param1, param2, param3) 
end 

iw tym przypadku [param] * jest równa param1, param2, param3 ... więc skąd hashlist wejść? i * array i & aProc?

Może ktoś proszę wyjaśnić to dla mnie

Odpowiedz

2

Jeśli ostatni argument metody jest niepusty hash dosłowny, można przekazać go jak ten

def foo(x, y, the_hash) 
    p the_hash['key2'] 
end 

foo(0, 0, :key1 => 'val1', 'key2' => 42)  # 42 

zamiast normalny sposób:

foo(0, 0, { :key1 => 'val1', 'key2' => 42 }) # 42 

Zazwyczaj hash jest domyślnie {} (def foo(x, y, the_hash = {})), więc przechodząc pusty hash pasuje do tego schematu.

Dodatkowo można określić jeden „catch-all” (ikona) argument, który stanie się tablicą wszystkich argumentów nie zostały przypisane do normalnych argumentów:

def foo(p1, *rest) 
    p rest 
end 

foo(0)   # "[]" 
foo(0, 23, 42) # "[23, 42]" 

Albo, na przykład

def foo(p1, *rest, p2) 
    p rest 
end 

foo(0, 100)   # "[]" 
foo(0, 100, 23, 42) # "[100, 23]" 

Nie można splatować argumentów przed argumentami z wartością domyślną. Dlatego składnia argumentów mieszania i argumenty splat są rzadko używane w połączeniu.

Wreszcie w definicji metody można mieć jako ostatni argument identyfikator z przedrostkiem & która będzie wskazywać na bloku przy metodzie inwokacji (jego Proc obiektu) lub być nil jeśli nie ma. Zazwyczaj nie jest to konieczne, jeśli chcesz wywołać blok - możesz użyć do tego celu yield.

def foo(&p) 
    p.call 
end 

foo { puts "hello" } # hello 

porównaniu

def foo 
    yield 
end 

foo { puts "hello" } # hello 
+0

def foo (p = 1, * reszta); koniec wydaje się działać –

+0

@FrederickCheung: Tak, masz rację. Dziękuję Ci. –

Powiązane problemy