2011-01-09 2 views
8

float 인스턴스의 자체 값을 변경하고 싶습니다.Ruby 및 Float 인스턴스의 자체 수정

나는 다음과 같은 방법이 있습니다

class Float 
    def round_by(precision) 
    (self * 10 ** precision).round.to_f/10 ** precision 
    end 
end 

을 그리고 나는 round_by을 추가하고 싶습니다! 메서드를 호출하여 자체 값을 수정합니다.

class Float 
    def round_by!(precision) 
    self = self.round_by(precision) 
    end 
end 

그러나 나는 자기 자신의 가치를 바꿀 수 없다는 말을 들었습니다.

아이디어가 있으십니까?

+2

'x = 13.2;를 호출하면 상상할 수 있습니까? x.round!'는 응용 프로그램의 모든 곳에서 '13.2'의 모든 값을 '13'이되게 만들었습니까? 얼마나 운이 좋을지. – Phrogz

답변

10

self 값을 변경할 수 없습니다. 항상 현재 객체를 가리키고 다른 객체를 가리킬 수 없습니다.

개체의 값을 변경하려면 다른 변형 방법을 호출하거나 인스턴스 변수 값을 설정하거나 변경하여 self을 다시 할당하지 말고이 값을 변경하십시오. 그러나이 경우에는 Float에 돌연변이 메소드가 없기 때문에 인스턴스 변수를 설정해도 아무 것도 구입하지 않으므로 기본 부동 연산자가 인스턴스 변수의 영향을받지 않으므로 그 점이 도움이되지 않습니다.

그래서 결론은 다음과 같습니다. 적어도 원하는 방식으로 부동 소수점에 변형 방법을 쓸 수 없습니다.

0

실제로 이것은 정말로 좋은 질문이며, 적어도 Float 클래스를 사용하면 안된다고해서 유감입니다. 불변입니다. 나의 제안은 그래서 의사 코드에

class MyFloat < Float 
    static CURRENT_FLOAT 

    def do_something 
    CURRENT_FLOAT = (a new float with modifications) 
    end 
end 
+0

트릭을 가져 주셔서 감사합니다! – Arkan

+2

'정적 CURRENT_FLOAT'이해야 할 일이 무엇인지 모르겠지만, 확실히하지는 않습니다. 또한'CURRENT_FLOAT'는 상수이기 때문에 다시 할당하면 안됩니다. 대신에 인스턴스 변수 ('@')를 사용하고 싶을 것입니다. 또한 'Float' 클래스는 실제로 인스턴스 변수를 허용하기 때문에 (Fixnum과 달리 즉각적인 값이 아니기 때문에 기술적으로 변경할 수 없습니다.) 실제로 Float을 서브 클래 싱해야 할 필요는 없습니다. 원숭이 패치 만하면됩니다. 그것이 권장되었는지 여부는 또 다른 문제입니다. (실제로 나는 둘 중 하나만 추천하고 변경 가능한 메서드는 정의하지 않는 것이 좋습니다). – sepp2k

+0

아이디어는 float 객체 인 클래스의 정적 변수를 작성한 다음 bang 메소드를 사용할 때마다 새 float를 작성하고 current_float로 설정하여 파괴적으로 만듭니다. – sethvargo

1

당신은 또한 인스턴스 변수에 떠 클래스를 생성하고 저장할 수있는 것처럼, 자신의 클래스가 구현 (일명 모든 메소드를 상속) 플로트 작성하는 것입니다 :

class Variable 

    def initialize value = nil 
    @value = value 
    end 

    attr_accessor :value 

    def method_missing *args, &blk 
    @value.send(*args, &blk) 
    end 

    def to_s 
    @value.to_s 
    end 

    def round_by(precision) 
    (@value * 10 ** precision).round.to_f/10 ** precision 
    end 

    def round_by!(precision) 
    @value = round_by precision 
    end 
end 

a = Variable.new 3.141592653 

puts a   #=> 3.141592653 

a.round_by! 4 

puts a   #=> 3.1416 

"클래스 변수"here 사용에 대해 자세히 알아보십시오.

관련 문제