Ruby,setter和initialize方法有什么区别

时间:2012-08-02 03:39:20

标签: initialization setter

class Account
  def initialize(starting_balance = 0)
     @balance = starting_balance
  end

  def balance #instance getter method
     @balance #instance variable visible only to this object
  end

  def balance=(new_amount)
     @balance = new_amount
  end

  def deposit(amount)
     @balance+=amount
  end

  @@bank_name= "MyBank.com" # class (static) variable

  # A class method
  def self.bank_name
     @@bank_name
  end
  # or: def SavingsAccount.bank_name : @@bank_name : end

end

我想以粗体理解代码段。他们在做什么? setter和initialize方法之间有什么区别。 如果我有一个对象test = Account.new(),为什么test(30)给出错误。是不是假设用参数30调用setter方法并设置余额?

1 个答案:

答案 0 :(得分:3)

initialize是执行Account.newAccount.new(my_starting_balance)时在新创建的对象上调用的方法。在第一种情况下,initialize将使用0的默认值starting_balancemy_starting_balance的第二种情况调用。

balance= my_account.balance = some_value是类my_account的实例时,会调用setter方法Account。因此,如果您有以下代码,{1}将在第1行(以0为参数)和第2行{以及23为initialize作为参数调用:

balance=

当然在这种情况下,我也可以编写以下内容,而不是使用setter方法:

my_account = Account.new
my_account.balance = 23

然而,这并不总是有效,因为有些时候您可能想要在创建对象之后更改my_account = Account.new(23) 的值。

  

如果我有一个对象test = Account.new(),为什么test(30)会出错。

因为balance表示"使用参数30"调用方法test(30);并且代码中没有名为test的方法。


关于代码的第二个粗体部分:正如注释所示,它设置了一个名为test的类变量,并定义了一个返回该变量值的类方法。