2016-06-23 6 views
1

У меня возникла проблема, когда при использовании цикла и передачи объекта в метод мой объект изменяется при возврате метода, прерывая следующую итерацию.Передача копии объекта методу

код я использую довольно сложный, поэтому я буду упрощать следующим:

val car: Car = expensiveMethod("greenCar") 

for (i <- 1 to 5) { 
    foo(car) 
} 

def foo (car: Car) = { 
    assert(car.name == "greenCar") 
    car.name = "redCar" 
} 

expensiveMethod является, как это звучит, дорого, поэтому я бы предпочел не называть его внутри для цикла каждый раз. Автомобиль также не относится к классу case, поэтому я не могу использовать встроенный метод copy.

Есть ли простой способ отправить копию car в foo или альтернативный подход?

+0

Автомобиль - это Java не scala, и ваш метод foo не является допустимым методом Scala (он не компилируется), так как вы делаете переназначение в val ... – Simon

+0

Упс. Исправлена ​​подпись метода, теперь должно быть хорошо. – karoma

+0

Нет, все еще есть переназначение val (car.name =, хотя автомобиль является val как аргумент метода). – Simon

ответ

0

Может быть, что имени член вашей автомобилей класса является публичным и изменчивым. Также из определения функции foo подпись - это foo: (car: Car) Unit, что может означать, что это не чистая функция, побочная эффектная функция (или процедура) в этом случае в качестве ее модификации. Вы должны явно создать копию параметра и изменить его.