*
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
Bu yüzden, 'paragraflara erişirken [0] 'tekniği kullanılırsa, savunmayı kullanmalıyım? – shmichael
@shmichael Yönteminizi nasıl arıyorsunuz? Argümanlarınızın böyle bir diziye sokulmasını istemiyorsanız uyarlamaları kullanmayın. –
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