나는 이런 식으로 "자기"를 변경할 수있어 올 방법 :하지 않는 이유는왜 자기의 가치를 바꿀 수 없습니까?
self = self.map {|x| x*2}
:
self.map! {|x| x*2}
또는 이러한 방법 :
self.replace(self.map {|x| x*2})
하지만이 방법을 Ruby는 "self"변수가 가리키는 객체를 변경할 수있게 해주지 만 객체의 속성을 변경할 수있게합니까?
나는 이런 식으로 "자기"를 변경할 수있어 올 방법 :하지 않는 이유는왜 자기의 가치를 바꿀 수 없습니까?
self = self.map {|x| x*2}
:
self.map! {|x| x*2}
또는 이러한 방법 :
self.replace(self.map {|x| x*2})
하지만이 방법을 Ruby는 "self"변수가 가리키는 객체를 변경할 수있게 해주지 만 객체의 속성을 변경할 수있게합니까?
답이 아니라 단서입니다.
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
자기를 다른 것으로 변경할 수 없습니다.
고맙습니다. 내 질문을 명확하게 도왔습니다! – user3680688
루비에서 값과 변수는 참조 (객체에 대한 포인터)입니다. 변수에 대입하면 다른 객체를 가리킬뿐입니다. 변수가 가리키는 객체에는 아무런 영향을 미치지 않습니다. 개체를 변경하려면 해당 개체에 대한 메서드 (속성 getters/setters 포함)를 호출해야합니다.
self
은 메서드가 호출 된 개체를 가리키는 변수로 생각할 수 있습니다. 할당 할 수 있으면 다른 객체를 가리킬 수 있습니다. 그렇게 할 수 있다면 메소드가 호출 된 객체를 변경하지 않을 것입니다. 대신, 해당 메서드의 다음 코드에서 self
을 사용하는 코드는 메서드가 호출 된 개체가 아니라 해당 개체를 사용하게됩니다. self
이 메소드가 호출 된 객체를 더 이상 가리 키지 않기 때문에 이것은 매우 혼란 스럽습니다. 이것은 기본 가정입니다.
답변 해 주셔서 감사합니다. 당신의 대답은 Ruby가 혼란 스럽거나 나쁜 관행 때문에 그것을 허용하지 않는 것 같습니다. 하지만 Ruby는 혼란 스럽거나 나쁜 습관을 가지고 있습니다. 그럼 왜 다른 사람을 허용하면서 이것을 허용하지 않습니까? 또한, 내가 아는 모든 언어는 이것을 허용하지 않습니다. 그래서이 문제는 단순한 나쁜 습관/혼란보다 더 큰 것처럼 보입니다. – user3680688
@ user3680688 : 그것은 단지 Ruby가 아닙니다. 거의 모든 객체 지향 언어는'this' /'self' 변수에 할당 할 수 없습니다. 또한, 사람들이 자신에게 할당하고 싶다고 생각하는 시간의 99 %는, 어떻게 든이 메소드가 호출 된 객체를 변경한다고 잘못 생각하기 때문입니다. 그러나 그것은 루비에서 변수에 할당하는 것이 아닙니다. 변수가 다른 객체를 가리 키기 만하면됩니다. – newacct
"또한 내가 아는 모든 언어는 이것을 허용하지 않습니다." 루비 만이 아니라는 것을 깨달았습니다. 귀하의 답변에 시간을 내 주셔서 감사합니다,하지만 당신은 내 질문에 대답하지 않습니다. 나는 자기 자신의 가치를 바꾸고 싶다는 것은 나쁜 습관이라고 인정할 것입니다. 그러나 왜이 모든 언어들이이 나쁜 습관을 ** 불가능하게 만들었습니까 **? 왜 이거지? 이렇게 많은 다른 나쁜 습관이 허용 될 때. 당신의 설명에 뭔가 빠져있는 것 같습니다. – user3680688
첫 번째 두 옵션은 값/속성 만 바꾸기 때문에 세 번째 옵션은 실제로 원하지 않는 개체 자체를 대체 할 수 있기 때문에 내 생각 엔 – mhutter
어렵지 않습니다. 불가능합니다. –