ArgumentError Nedir?
Evet, Ruby çok hoşgörülü bir dil olabilir, ama bazen fazlasıyla titizdir. O titizliği, doğru parametreleri bekleyerek gösteriyor. Şimdi, bu hatayla karşılaşıldığında nasıl çözüm üretebileceğimize bakalım.
Hata Mesajı: Ne Anlama Geliyor?
```
ArgumentError: wrong number of arguments (given 2, expected 1)
```
Burada, wrong number of arguments kısmı önemli. Bu, metodun beklediğinden fazla ya da eksik argüman gönderildiğini belirtiyor.
ArgumentError’a Örnek: Yanlış Argüman Sayısı
```ruby
def selamla(isim)
puts "Merhaba, #{isim}!"
end
```
Bu metodun sadece bir parametre kabul ettiğini biliyoruz: isim. Ancak, biz buna iki argüman verirsek:
```ruby
selamla("Ali", "Veli")
```
Ruby, şu hata mesajını verecektir:
```
ArgumentError: wrong number of arguments (given 2, expected 1)
```
Neden mi? Çünkü selamla metodu yalnızca bir argüman bekliyor, ama biz ona iki argüman gönderdik. Bu durumda Ruby, ikinci argümanı nasıl işleyeceğini bilemez ve ArgumentError hatasını fırlatır.
Çözüm: Doğru Sayıda ve Türde Argüman Kullanma
```ruby
selamla("Ali")
```
Bu durumda hata almazsınız çünkü metod sadece bir parametre bekliyor ve ona uygun bir değer gönderiyorsunuz.
ArgumentError: Yanlış Türde Argüman
```ruby
def topla(a, b)
a + b
end
```
Eğer biz buna iki string gönderirsek:
```ruby
topla("Merhaba", "Dünya")
```
Ruby, ArgumentError vermez, çünkü iki string'i toplamak, Ruby için geçerli bir işlem. Ancak, sayı bekleyen bir metodda string gönderdiğinizde Ruby size şu hata mesajını verebilir:
```
ArgumentError: invalid value for Integer(): "Merhaba"
```
Burada, Ruby türlerin uyumsuzluğundan dolayı hata verir. Bu tür hataları önlemek için, her zaman beklenen türde argümanlar gönderdiğinizden emin olun.
ArgumentError ile İlgili Pratik İpuçları
- Default Değerler Kullanın: Eğer metodunuzda bazı argümanlar isteğe bağlıysa, varsayılan değerler kullanarak hataların önüne geçebilirsiniz.
```ruby
def selamla(isim = "Misafir")
puts "Merhaba, #{isim}!"
end
```
- Tip Kontrolleri Yapın: Argüman türünü kontrol etmek için, metodu çağırmadan önce tür denetimi yapabilirsiniz.
```ruby
def topla(a, b)
raise ArgumentError, 'Argümanlar sayı olmalı' unless a.is_a?(Numeric) && b.is_a?(Numeric)
a + b
end
```
Sonuç
Unutmayın, ArgumentError hatasıyla karşılaştığınızda sakin olun ve neyin yanlış gittiğini anlamaya çalışın. Hata mesajları genellikle neyi düzeltmeniz gerektiği konusunda oldukça yardımcıdır.