Öncelikle herkese iyi forumlar.
Codewars sitesinde ruby dilinde örnekler çözerken bir soruda takılı kaldım. Link
Linkdeki şu kısım hariç hepsini çözdüm.
Test.assert_equals(array, [1, 2, 3, 4, 5], 'The original array must not be changed')
square metodunu nasıl yazdınız, array'i değiştiriyorsunuz galiba, Ruby’de array nasıl kopyalanıyorsa (.clone olabilir mi) belki öyle kopyaladıktan sonra işleminizi yapabilirsiniz, veya self.map { |n| n * n } de kopya döndürüyor gibi.
Aslında orada bir fonksiyon direkt test edilmiyor, sizin yazdığınız diğer metodların kendilerine paslanan array’i değiştirmemesi gerekliliği test ediliyor. Yani square, cube ve diğerlerinin içine yazdıklarınız array’in kendisini değiştirmemeli.
Yani şunu istiyorlar anladığım kadarıyla
"array" [1, 2, 3] olarak başladı
array.square() çağrıldı
"array" hâla [1, 2, 3] olmalı bu satırda, [1, 4, 9] değil
Mesela Python’da
def square(liste):
for j, _ in enumerate(liste):
liste[j] **= 2
return liste
>>> liste = [1, 2, 3]
>>> square(liste)
[1, 4, 9]
>>> liste
[1, 4, 9]
Bu versiyon listenin kendisini değiştiriyor.
Buna karşılık
def kare(liste):
# Ruby'deki .clone gibi galiba
liste_kopya = liste[:]
for j, _ in enumerate(liste_kopya):
liste_kopya[j] **= 2
return liste_kopya
veya
def kare(liste):
# Ruby'deki .map gibi galiba
return [eleman ** 2 for eleman in liste]
listeyi değiştirmiyorlar:
>>> liste = [8, 9, 0]
>>> kare(liste)
[64, 81, 0]
>>> liste
[8, 9, 0]