2014-09-14 5 views
4

나는 이런 식으로 "자기"를 변경할 수있어 올 방법 :하지 않는 이유는왜 자기의 가치를 바꿀 수 없습니까?

self = self.map {|x| x*2} 

:

self.map! {|x| x*2} 

또는 이러한 방법 :

self.replace(self.map {|x| x*2}) 

하지만이 방법을 Ruby는 "self"변수가 가리키는 객체를 변경할 수있게 해주지 만 객체의 속성을 변경할 수있게합니까?

+0

첫 번째 두 옵션은 값/속성 만 바꾸기 때문에 세 번째 옵션은 실제로 원하지 않는 개체 자체를 대체 할 수 있기 때문에 내 생각 엔 – mhutter

+2

어렵지 않습니다. 불가능합니다. –

답변

4

답이 아니라 단서입니다.

a=[1,2] 
=>[1,2] 
a.object_id 
=>2938 

a.map!{|x| x*2} 
=>[2,4] 
a.object_id # different data but still the same object 
=>2938 

a.replace(a.map {|x| x*2}) 
=>[4,8] 
a.object_id # different data but still the same object 
=>2938 

a = a.map{|x| x*2} # .map will create a new object assign to a 
=>[8,16] 
a.object_id #different object 
=>2940 

자기를 다른 것으로 변경할 수 없습니다.

+0

고맙습니다. 내 질문을 명확하게 도왔습니다! – user3680688

1

루비에서 값과 변수는 참조 (객체에 대한 포인터)입니다. 변수에 대입하면 다른 객체를 가리킬뿐입니다. 변수가 가리키는 객체에는 아무런 영향을 미치지 않습니다. 개체를 변경하려면 해당 개체에 대한 메서드 (속성 getters/setters 포함)를 호출해야합니다.

self은 메서드가 호출 된 개체를 가리키는 변수로 생각할 수 있습니다. 할당 할 수 있으면 다른 객체를 가리킬 수 있습니다. 그렇게 할 수 있다면 메소드가 호출 된 객체를 변경하지 않을 것입니다. 대신, 해당 메서드의 다음 코드에서 self을 사용하는 코드는 메서드가 호출 된 개체가 아니라 해당 개체를 사용하게됩니다. self이 메소드가 호출 된 객체를 더 이상 가리 키지 않기 때문에 이것은 매우 혼란 스럽습니다. 이것은 기본 가정입니다.

+0

답변 해 주셔서 감사합니다. 당신의 대답은 Ruby가 혼란 스럽거나 나쁜 관행 때문에 그것을 허용하지 않는 것 같습니다. 하지만 Ruby는 혼란 스럽거나 나쁜 습관을 가지고 있습니다. 그럼 왜 다른 사람을 허용하면서 이것을 허용하지 않습니까? 또한, 내가 아는 모든 언어는 이것을 허용하지 않습니다. 그래서이 문제는 단순한 나쁜 습관/혼란보다 더 큰 것처럼 보입니다. – user3680688

+0

@ user3680688 : 그것은 단지 Ruby가 아닙니다. 거의 모든 객체 지향 언어는'this' /'self' 변수에 할당 할 수 없습니다. 또한, 사람들이 자신에게 할당하고 싶다고 생각하는 시간의 99 %는, 어떻게 든이 메소드가 호출 된 객체를 변경한다고 잘못 생각하기 때문입니다. 그러나 그것은 루비에서 변수에 할당하는 것이 아닙니다. 변수가 다른 객체를 가리 키기 만하면됩니다. – newacct

+0

"또한 내가 아는 모든 언어는 이것을 허용하지 않습니다." 루비 만이 아니라는 것을 깨달았습니다. 귀하의 답변에 시간을 내 주셔서 감사합니다,하지만 당신은 내 질문에 대답하지 않습니다. 나는 자기 자신의 가치를 바꾸고 싶다는 것은 나쁜 습관이라고 인정할 것입니다. 그러나 왜이 모든 언어들이이 나쁜 습관을 ** 불가능하게 만들었습니까 **? 왜 이거지? 이렇게 많은 다른 나쁜 습관이 허용 될 때. 당신의 설명에 뭔가 빠져있는 것 같습니다. – user3680688

관련 문제