2011-01-09 16 views
8

Float örneğinin kendi değerini değiştirmek istiyorum.Float örneği için kendi kendine yakma ve değiştirme

Aşağıdaki yöntemi vardır:

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

Ve round_by eklemek istiyorum! öz değeri değiştirecek yöntem.

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

Ama kendim değerini değiştiremediğimi söyleyen bir hatayla karşılaştım.

Herhangi bir fikrin var mı?

+2

Eğer x = 13.2; x.round! 'uygulamanızın her yerinde 13.2 'değerinin' 13 'olmasına neden oldu? Ne kadar şanssız olurdu. – Phrogz

cevap

10

self değerini değiştiremezsiniz. Her zaman geçerli nesneyi işaret eder, başka bir şeye işaret edemezsiniz.

Bir nesnenin değerini değiştirmek istediğinizde, bunu başka mutasyon yöntemlerini çağırarak veya self'u yeniden denemeye çalışarak değil, örnek değişkenlerinin değerlerini ayarlayarak veya değiştirerek yaparsınız. Ancak, bu durumda size yardımcı olmayacaktır, çünkü Float herhangi bir mutasyon yöntemine sahip değildir ve ayar örneği değişkenleri size hiçbir şey satın almaz, çünkü varsayılan float işlemlerinin hiçbiri herhangi bir örnek değişkeninden etkilenmez.

Yani alt çizgi şudur: en azından istediğiniz şekilde, üzerinde yüzen yöntemleri mutasyona yazamam.

0

Bu aslında gerçekten iyi bir sorudur ve ben bunu yapamazsınız söylemek üzgünüm - en azından Float sınıfıyla. Bu değişmez. Benim önerim bu yüzden sözde kod

class MyFloat < Float 
    static CURRENT_FLOAT 

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

Numara için teşekkürler! – Arkan

+2

Statik CURRENT_FLOAT'un ne yapması gerektiğinden emin değilim, ama kesinlikle bunu yapmıyor. Ayrıca "CURRENT_FLOAT" bir sabittir ve bu nedenle yeniden atanmamalıdır. Muhtemelen bunun yerine bir örnek değişkeni ('@') kullanmak istersiniz. Ayrıca, Float'ın sınıfı örnek değişkenlere izin verdiğinden (Fixnum'dan farklı olarak, bu hemen bir değer değildir ve bu nedenle teknik olarak değişmez değildir), aslında bunu yapmak için Float'ın alt sınıfına ihtiyacınız yoktur, sadece maymun yama yapabilir. Önerilse de başka bir konu olmasına rağmen (aslında tavsiye edemeyeceğim ve sadece bir değişken metodu tanımlamadım). – sepp2k

+0

fikri, float nesnesi olan bir sınıfın statik bir değişkeni oluşturmaktı ve sonra bir patlama yöntemini kullandığınızda, yeni bir float oluşturup onu current_float olarak ayarla, dolayısıyla yıkıcı oluyordu. – sethvargo

1

Ayrıca örnek değişkeninde şamandıra bir sınıf oluşturmak ve saklayabilir gibi, kendi sınıfının uyguladığı (aka tüm yöntemleri devralır) Float oluşturmak olacaktır:

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 

"sınıfı Değişken" here kullanma hakkında daha fazla bilgi.

İlgili konular