2015-11-10 3 views
0

Я создал метод, который наследуется от класса Array, чтобы поменять местами два массива:своп массивы в Ruby,

class Array 
    def exchange_with!(other_array) 
    self,other_array=other_array,self 
    end 
end 

Но я получаю ошибку Can't change the value of self (SyntaxError). Я также попытался:

class Array 
    def exchange_with!(other_array) 
    self.replace(other_array) 
    other_array.replace(self) 
    end 
end 

Но она возвращает значение последнего swaped массива:

a=[1,2,4] 
b=[5,6,7] 
a.exchange_with!(b) 
a #> [5, 6, 7] 
b #> [5, 6, 7] 

то, что мне нужно, это a #> [5, 6, 7] и b #>[1, 2, 4]

+1

Не совсем понятно, что вы пытаетесь сделать. Вы хотите поменять местами идентификаторы двух массивов (схожий с [tag: smalltalk] '' стать: ') или содержимым? –

+0

я меняю весь массив, при условии, что их размеры равны .. – owade

+0

Да, но вы хотите поменять содержимое или личность? –

ответ

2

Попробуйте ниже:

class Array 
    def exchange_with!(other_array) 
    other = self.dup 
    self.replace(other_array) 
    other_array.replace(other) 
    end 
end 

Вы не можете назначать новые значения self, но вы всегда можете изменить содержимое self с помощью методов, доступных в этом классе.

Здесь мы можем использовать Array#replace, чтобы заменить содержимое массива другим ary.

Чтобы лучше понять, как переменные передаются методам в Ruby, посмотрите на this article.

+1

Это хорошее решение для замены содержимого. Не совсем ясно из вопроса, хочет ли OP обменять содержимое или идентификаторы. Если последнее, ответ прост: вы не можете использовать [tag: smalltalk]. –

+0

можно использовать self.clone вместо self.dup? – owade

+0

Вы были AWOL. –

Смежные вопросы