ArgumentError Nedir?
Bu hatanın temel nedeni, fonksiyonun veya metodun beklediği türdeki parametreyi almadığı durumdur. Ruby, metodlara gönderilen argümanların türüne oldukça duyarlıdır. Örneğin, bir metod sayısal değer beklerken siz bir dizi gönderirseniz, Ruby size ArgumentError verir.
Neden ArgumentError Alırsınız?
Örneğin:
def sayi_birlestir(sayi)
puts "Girilen sayi: #{sayi}"
end
# Yanlış parametre
sayi_birlestir("Bir sayı") # ArgumentError alırsınız
Yukarıdaki kodda `sayi_birlestir` fonksiyonu bir sayı beklerken, biz ona bir string (yazı) gönderdik. Ruby, tipi uyumsuz olduğu için hemen bir ArgumentError ile karşılık verdi. Hata mesajı şöyle bir şey olabilir: `ArgumentError: wrong number of arguments (given 1, expected 0..0)`.
ArgumentError'ı Çözme Yöntemleri
Her metod, belirli türde argümanlar bekler. Ruby'de tip güvenliği yoktur, ancak yine de hangi türün beklendiğini bilmek önemlidir. Bu tür hataları önlemek için metodları çağırmadan önce, göndereceğiniz argümanın türünü kontrol edin.
def sayi_birlestir(sayi)
raise ArgumentError, 'Sayi bir tam sayı olmalı' unless sayi.is_a?(Integer)
puts "Girilen sayi: #{sayi}"
end
# Şimdi doğru parametreyi veriyoruz
sayi_birlestir(5) # Sorun yok!
Yukarıdaki örnekte, ArgumentError'ı önlemek için, gönderilen argümanın tam sayı (Integer) olup olmadığını kontrol ettik. Eğer değilse, biz kendimiz uygun bir hata mesajı ile ArgumentError'ı tetikliyoruz.
Ruby, metodu çağırırken yanlış sayıda parametre gönderilmesine de ArgumentError ile yanıt verebilir. Bir metod yalnızca bir parametre beklerken, iki parametre gönderirseniz, yine aynı hatayı alırsınız.
def selamla(isim)
puts "Merhaba, #{isim}!"
end
# Yanlış parametre sayısı
selamla("Ali", "Veli") # ArgumentError!
Bu durumda, metod yalnızca bir parametre kabul ediyor, ancak biz iki parametre göndermeye çalıştık. Ruby bu durumu fark eder ve hemen ArgumentError verir.
Bir diğer yöntem ise metodlarınızda varsayılan değerler kullanmaktır. Bu, argümanları eksik veya hatalı gönderdiğinizde bile hatadan kaçmanıza yardımcı olur.
def merhaba(isim = "Dünya")
puts "Merhaba, #{isim}!"
end
# Parametre göndermediğimizde bile hata almayız
merhaba # Merhaba, Dünya!
merhaba("Ahmet") # Merhaba, Ahmet!
Bu şekilde, parametre vermezseniz bile ArgumentError almazsınız, çünkü `isim` parametresi bir varsayılan değere sahiptir.