2017-09-24 65 views
-1

如何使我的代碼工作,以便balance屬性不直接訪問實例變量(我相信它是@balance)?有人可以解釋一個屬性的含義訪問一個實例變量?如何讓我的類屬性不能直接訪問實例變量?

我剛剛開始使用Ruby,剛剛學習了Ruby類。在本章中,我的目標是理解實例變量的概念,向我們展示getter和setter方法,瞭解如何使用實例方法以及理解封裝的概念。

class BankAccount 
    attr_accessor :balance 

    def initialize(balance) 
    @balance = balance 
    end 

    def withdraw(amount) 
    if (balance >= amount) 
     @balance = balance - amount 
    end 
    end 
end 
+1

只要刪除'attr_accessor'並添加您的'balance'方法的版本。 –

+1

順便說一句,從你的代碼中不明顯__at all__,你爲什麼要'balance'不讀'@ balance'。 –

+0

您將「餘額屬性」與「餘額實例變量」區分開來,並且該部分很混亂。澄清問題:您是否使用Rails進行編程,並且是數據庫表中列的「餘額屬性」?否則,就像@SergioTulentsev指出的那樣,爲什麼你想要有一個區別並不明顯。由'attr_accessor:balance'創建的getter和setter方法被SUPPOSED來獲取和設置實例變量(它是@balance)。 – Isaac

回答

1

在Ruby attr_reader :balance或多或少只是以下方法的便利版本:

def balance 
    @balance 
end 

同樣,attr_writer :balance僅僅是

def balance=(value) 
    @balance = value 
end 

attr_accessor :balance的簡寫形式是短期的attr_reader :balanceattr_writer :balance

因此,你可以看到attr_reader訪問實例變量沒有什麼特別的,例如,在您的代碼中,您還可以訪問#initalize#withdraw中的實例變量。

你需要說明爲什麼你不想直接訪問它。而這甚至意味着什麼。因爲你可以使用@balance訪問實例變量,在我看來,沒有間接

0

定義自己的balance閱讀方法的版本:

class BankAccount 
    attr_accessor :balance 

    def initialize(balance) 
    @balance = balance 
    end 

    def withdraw(amount) 
    if (balance >= amount) 
     @balance = balance - amount 
    end 
    end 

    def balance 
    'balance from method directly' 
    end 
end 

現在當你調用balance方法,它會相應地讀你定義一個和返回值。

相關問題