是一個Ruby新手,我試圖用3個實例變量來定義一個類,即unit_rows,unit_cols和unit_sz。在這個類中,我希望unit_rows和unit_cols可以從外部自由獲取和設置,但是我希望unit_sz被計算(即不可設置)爲(unit_rows * unit_cols)。我希望unit_sz實例變量可以從另一個類中獲取,但該值在返回之前應該是行和列的乘積。Ruby - 類實例變量getter setter方法
- 當我實例化類和打印unit_inst.unit_sz它正確打印值:本課程將包含「unit_sz」許多變數,因此我想動態遍歷所有的實例變量
情況下,可以延長作爲產品
- 當我不調用「unit_sz」的getter方法,當我調用方法returnVars動態迭代實例variabes並打印值時,我得到錯誤的答案「6」,這是默認值在構造函數中
- 當我調用get_方法「unit_ sz「,當我調用方法returnVars動態迭代實例變量並打印值時,我得到正確的產品
- 顯式調用」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}"
嗨,Zach,感謝您的回答。爲什麼我希望unit_sz(以及許多其他)成爲實例變量的原因是我不想繼續從外部調用這些方法 - 讓因變量自動計算而不是明確調用方法會容易得多。另外,我想遍歷所有變量並將它們打印出來。同時,在循環實例變量中,我做了'val = eval(「self。#{key}」)''。我相信self.variable的名字叫做「getter」方法。 – user2805732
另外,對於第二部分,我不想要一個常量,而是一個私有變量,它可以根據方法調用的順序在多個方法中更改。 – user2805732
我刪除了鍵的第一個字符以刪除「@」 – user2805732