2014-02-11 392 views
0

是一個Ruby新手,我試圖用3個實例變量來定義一個類,即unit_rows,unit_cols和unit_sz。在這個類中,我希望unit_rows和unit_cols可以從外部自由獲取和設置,但是我希望unit_sz被計算(即不可設置)爲(unit_rows * unit_cols)。我希望unit_sz實例變量可以從另一個類中獲取,但該值在返回之前應該是行和列的乘積。Ruby - 類實例變量getter setter方法

  1. 當我實例化類和打印unit_inst.unit_sz它正確打印值:本課程將包含「unit_sz」許多變數,因此我想動態遍歷所有的實例變量

    情況下,可以延長作爲產品

  2. 當我不調用「unit_sz」的getter方法,當我調用方法returnVars動態迭代實例variabes並打印值時,我得到錯誤的答案「6」,這是默認值在構造函數中
  3. 當我調用get_方法「unit_ sz「,當我調用方法returnVars動態迭代實例變量並打印值時,我得到正確的產品
  4. 顯式調用」self.unit_sz「正確輸出值,但無法動態執行此操作

如何確保「unit_sz」實例變量作爲產品正確計算,無論是當我從外部調用並動態迭代類「returnVars」方法中的實例變量?

此外,我如何聲明一個本地類變量,可以使用我的meth1和meth2(不傳遞值),但不能從外部訪問?我可以通過定義一個沒有getter/setter的類實例變量來實現它 - 這是正確的方法

非常感謝!

下面是我的代碼

#!/usr/local/bin/ruby -w 
class Unit 

def initialize 
@unit_cols = 2 
@unit_rows = 2 

@unit_sz = 6 
end 

attr_accessor :unit_cols, :unit_rows 
#attr_reader :unit_sz 

def unit_sz 
    @unit_sz = @unit_rows * @unit_cols 
end 

def returnVars 
    ret_str = "" 
    temp = self.instance_variables 
    for param in temp 
     key = param.to_s 
     val = instance_variable_get(("" + key).intern) 
     key = key[1..-1] 
     ret_str << "#{key.upcase} = #{val.to_s};" << "\n" 
    end 
    puts "check1 = #{self.unit_sz}" 
    return ret_str 
end 

#meth1 
def meth1 


end 

#meth2 
def meth2 


end 
end 

unit = Unit.new 
#puts "unit_sz = #{unit.unit_sz}" 
puts "#{unit.returnVars}" 

回答

0

沒有理由(我可以從你的問題看),該@unit_sz需要有一個實例變量 - 你可以把它當作一個方法。在有些情況下,您可能要設置伊娃(緩存,記憶化等),但對於這個簡單的例子,unit_sz應該是:

def unit_sz 
    unit_rows * unit_cols 
end 

注意,此方法使用訪問器,而不是直接訪問實例變量。一般來說,這是一個很好的做法,因爲這些值是消息發送的結果,您可以在增加或擴展該類時使用這些值。實例變量應該在initialize中設置,或者在其各自的setter中設置,但通常不會在其他地方設置。

在遍歷所有實例變量時,實質上是創建了一個自定義的方法,但是您並不事先知道您定義了哪些實例變量。這裏的麻煩是你有行爲和數據的匯合。類的結構(它的實例變量和方法)應該定義行爲,變量應該包含數據,但是在這裏,由於變量數量可變,任何特定實例的結構都傾向於數據端。如果您需要任意數量的鍵值對,請改爲使用散列。不過,我認爲你沒有這樣做,因爲@unit_sz問題已經被處理了。

至於你的最後一個問題,你似乎正在定義一個靜態變量(即沒有getters或setters,所以只有你在類中定義的值)。您可以使用常數(MY_VAR = 5)或私有方法(我更喜歡):

class Unit 

    private 

    def my_var 
    5 
    end 
end  
+0

嗨,Zach,感謝您的回答。爲什麼我希望unit_sz(以及許多其他)成爲實例變量的原因是我不想繼續從外部調用這些方法 - 讓因變量自動計算而不是明確調用方法會容易得多。另外,我想遍歷所有變量並將它們打印出來。同時,在循環實例變量中,我做了'val = eval(「self。#{key}」)''。我相信self.variable的名字叫做「getter」方法。 – user2805732

+0

另外,對於第二部分,我不想要一個常量,而是一個私有變量,它可以根據方法調用的順序在多個方法中更改。 – user2805732

+0

我刪除了鍵的第一個字符以刪除「@」 – user2805732