2012-01-27 10 views
5

Ben daha derinlemesine Ruby anlamaya çalışıyorum ve okuyordu:Parametrelerin yakut yöntemlerine geçirilmesinin farklı olanakları nelerdir? param/hashlist/dizi/aproc?

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

Ancak, ben bu tanımı aşağıdaki araçları neyi anlamıyorum:

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

ben "param" biliyorum herhangi bir sayıda parametre belirtildi ve sonra kalanın ne anlama geldiğini kaybettim? Örneğin

, ben:

def doIt(param1, param2, param3) 
end 

ve bu durumda

[param] * param1, param2, param3 ... yani nereye geliyor hashlist gelmez eşittir? ve * dizi ve & aProc? bir yöntemin son argüman boş olmayan bir karma değişmezi ise

Birisi benim için bu açıklar mısınız

cevap

2

, bunun yerine normal bir şekilde bu

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

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

gibi iletebilirsiniz:

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

Genellikle karma {} (def foo(x, y, the_hash = {})) bu yüzden boş bir karma geçen bu şemaya uygun öndeğer olarak alır.

def foo(p1, *rest) 
    p rest 
end 

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

Veya, örneğin:

Ayrıca, zaten normal bir argüman atanmamış tüm argümanları dizisi haline gelecek bir "catch-all" (uyarısı) argüman belirtebilirsiniz

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

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

Varsayılan değeri olan argümanlardan önce splat argümanlarına sahip olamazsınız. Bu nedenle, karma argüman sözdizimi ve uyarlama bağımsız değişkeni kombinasyon halinde nadiren kullanılır.

Son olarak, yöntem tanımında geçen argüman olarak hiçbiri varsa nil metot çağrımı (onun Proc nesne) de bloğa işaret veya olacak & öneki bir tanımlayıcı olabilir. Bu sadece blok çağırmak istiyorsanız normalde gerekli değildir - bunun için yield kullanabilirsiniz.

def foo(&p) 
    p.call 
end 

foo { puts "hello" } # hello 

genel

def foo 
    yield 
end 

foo { puts "hello" } # hello 
+0

def fan (p = 1, * kalan); son –

+0

@FrederickCheung gibi görünüyor: Evet, haklısın. Teşekkür ederim. –