2014-02-09 81 views
2

有一些我不明白關於ruby 類實例變量或方法**。 所以我有這個代碼,不斷給我這個錯誤,我不明白Ruby實例方法和變量

看起來紅寶石認爲,我想要調用Float.in_celsius,但我想在我的類實例中進行此調用。

#----------------------------------- 
def ftoc(fr) 
fr = fr.to_f 
if (fr == 32) 
    c = 0 
elsif (fr == 212) 
    c = 100 
else 
    c = (fr-32.0)*(5.0/9.0) 
end 

return c 
end 

def ctof (cl) 
cl = cl.to_f 
f = (cl*(9.0/5.0))+32.0 
return f 
end 
#----------------------------------- 

class Temperature 
attr_accessor :in_celsius, :in_fahrenheit 

#class metods 
def self.from_celsius(cel) 
    puts "from celsious\n" 
    puts "cel: #{cel}\n" 
    @in_fahrenheit = cel 
    @in_celsius = ctof(cel) 
    puts "==============================\n" 
    return @in_celsius 
end 

def self.in_celsius 
    @in_celsius 
end 


end 


puts "==============================\n" 
puts Temperature.from_celsius(50).in_celsius 
puts Temperature.from_celsius(50).in_fahrenheit 

和錯誤是 test.rb:54: in '<main>' : undefined method 'in_celsius' for 122.0:float (noMethod Error) enter code here

+0

你可能想使用一個模塊爲這樣的事情 - 只是我2C –

+0

Grag,可以簡化'FTOC(FR)'來'高清FTOC(FR)( fr-32.0)*(5.0/9.0)end'。你不需要將'fr'轉換爲浮點數,因爲'fr-32.0'會這樣做,並且你不需要'return',因爲Ruby返回最後一次執行的計算。 'ctof()'相同。 –

+0

@CarySwoveland OP對類實例的類實例變量和實例變量感到困惑。需要先解決這個問題。 –

回答

3

對於Ruby中的類是如何工作的,你有一個基本的誤解。現在你所有的變量和方法定義在級別。這意味着你在方法中所做的每件事都直接作用於課堂本身。相反,您應該創建實例Temperature

class Temperature 
    # special method called when creating a new instance 
    def initialize celsius 
    @in_celsius = celsius 
    @in_fahrenheit = celsius * 9/5.0 + 32 
    end 

    def self.from_celsius celsius 
    new celsius # built in method to create an instance, passes argument to initialize 
    end 

    # we defined initialize using celsius, so here we must convert 
    def self.from_fahrenheit fahrenheit 
    new((fahrenheit - 32) * 5/9.0) 
    end 

    private_class_method :new # people must use from_celsius or from_fahrenheit 

    # make instance variables readable outside the class 
    attr_accessor :in_celsius, :in_fahrenheit 
end 

Temperature.from_celsius(50).in_celsius 

此代碼是不完美的(from_fahrenheit做冗餘轉換),但它應該給你的是如何重新設計你的類的想法。

+0

新((華氏 - 32)* 5/9.0)訣竅。 我的代碼不同,但這解決了我的問題... 非常感謝! – Grag808

0

from_celsius正在返回其不具有in_celsius方法的浮子。你需要它返回一個具有該方法的Temperature實例。

不得不說,你的意圖是有點混亂,除非你有類似溫度的其他用途,所以很難說你應該走哪條路。

+0

我認爲'return @ in_celsius'沒用,所以它可以被刪除。由於OP具有'attr_accessor:in_celsius,:in_fahrenheit'這一行,'def self.in_celsius..'雖然沒有意義。 –

+1

配合使用類級別的方法返回溫度的情況下不會爲他工作,要麼 – bjhaid

+0

@Arup Rakshit 爲什麼這麼說 'attr_accessor:in_celsius,:in_fahrenheit,DEF self.in_celsius' 沒有意義? – Grag808

0

讓我們來看看詳細的代碼puts Temperature.from_celsius(50).in_celsius

  1. 電話Temperature類的單方法::from_celsius。這是好的(帶有一些奇怪的),並且由於#ctof方法的結果,t返回作爲Float類的實例。

  2. 調用對象的實例方法#in_celsius,它是從上一個方法返回的。由於它是Float,因此解釋器搜索其實例方法#in_celsius,尚未找到它並拋出NoMethodError異常。

如何解決。

既然你把::from_celsiusTemperature類的構造函數,我相信,你殼牌浮動值傳遞到新的方法,並返回創建的對象。您將有類代碼如下:

def initialize(value) 
    @in_fahrenheit = cel 
    @in_celsius = ctof(cel) 
end 

def self.from_celsius(cel) 
    puts "from celsious\n" 
    puts "cel: #{cel}\n" 
    temp = Temperature.new(cel) 
    puts "==============================\n" 
    return temp 
end 
+0

嗯..看起來像我讀到關於Ruby類的東西... 我想我得到一個想法今天晚些時候會嘗試它... – Grag808

+0

謝謝... ...的迴應...我還沒有添加點爲您回答,因爲我在這裏還沒有名聲。 – Grag808