2010-09-13 17 views
58

bir karma Geçme? Bu soruyu incelemek oldukça zordu ve hiçbir şey bulamadım.gibi bir işleve (* args) ve onun anlamını

Tüm argümanlar aslında args [0] görünür görünüyor bu yüzden kendim gibi defansif kod yazarken buluyorum:

my_var = args[0].delete(:var_name) if args[0] 

Ama dışarı eksik daha iyi bir yolu olduğuna eminim.

cevap

88

*uyarısı (veya yıldız işareti) operatörüdür. Bir yöntem bağlamında, bir değişken uzunluk argüman listesi belirtir. Sizin durumunuzda, func'a gönderilen tüm argümanlar, args adında bir diziye konacaktır. Ayrıca sayısı değişken şöyle öncesinde belirli argümanlar belirtebilirsiniz:

def func2(arg1, arg2, *other_args) 
    # ... 
end 

Şimdi bu yöntemi çağırın diyelim:

func2(1, 2, 3, 4, 5) 

şimdi func2 içinde arg1, arg2 ve other_args incelerseniz o olacak aşağıdaki sonuçları elde edin: Sizin durumunuzda, bir karma değerini bir argüman olarak geçiriyor gibi görünüyorsunuz. func, args[0], gözlemlediğiniz gibi hashı içerecektir.

Kaynaklar:


Güncelleme OP'ın açıklamalara dayanarak

bir argüman olarak bir karma geçmek istiyorsanız, yapmanız gerekir kullanmaz uyarısı operatörü. Ruby, yöntem çağrılarınızda bir Hash (bir uyarı ile, okumaya devam edin) belirtenler de dahil olmak üzere, parantezleri çıkarmanıza izin verir. Bu nedenle:

my_func arg1, arg2, :html_arg => value, :html_arg2 => value2 

my_func(arg1, arg2, {:html_arg => value, :html_arg2 => value2}) 
Yakut sizin argüman listesindeki => operatörü, hatta açık {...} gösterimde olmadan, bir Hash gibi bir argüman almaya bilir gördüğünde (not

bu eşdeğerdir sadece karma argümanı son ise geçerlidir!).Bu karma toplamak istiyorsanız (muhtemelen yöntem tanımında varsayılan değer olarak boş bir karma belirtmek istiyoruz olsa)

, özel bir şey yapmak zorunda değilsiniz:

def my_func(arg1, arg2, html_args = {}) 
    # ... 
end 
+0

Bu yüzden, 'paragraflara erişirken [0] 'tekniği kullanılırsa, savunmayı kullanmalıyım? – shmichael

+0

@shmichael Yönteminizi nasıl arıyorsunuz? Argümanlarınızın böyle bir diziye sokulmasını istemiyorsanız uyarlamaları kullanmayın. –

+0

Rails sözleşmesini kullanıyorum (ör. "My_func arg1, arg2,: html_arg => value,: html_arg2 => value2"). İdeal olarak, bir "args" * hash * 'ı almak ve bir hash * içerebilecek bir' args' * dizisini almak istemiyorum. – shmichael

-3
def func(map={}) 
    x = map.delete(:y) 
end 
İlgili konular