有权访问实例方法的变量

时间:2014-03-31 14:04:33

标签: ruby-on-rails ruby

class BankAccount

  def self.create_for(first_name, last_name)
    @accounts ||= []
    @accounts << BankAccount.new(first_name, last_name)
  end

  def initialize(first_name, last_name)
    @balance = 0
    @first_name = first_name
    @last_name = last_name
  end

 def self.find_for(first_name, last_name)
    @accounts.find{|account| account.full_name == "#{first_name} #{last_name}"}
  end

  def full_name
    "#{@first_name} #{@last_name}"
  end

end

方法self.find_for如何运作?我对account变量如何访问full_name方法感到困惑?

bankacc = BankAccount.create_for "Kevin", "Shane"
BankAccount.find_for("Kevin", "Shane")
puts bankacc.inspect

2 个答案:

答案 0 :(得分:2)

如果将文件拆分为两个,也许它可以帮助您理解这个概念。

此类创建并跟踪BankAccount实例:

class BankAccounts
 def self.create_for(first_name, last_name)
   @accounts ||= []
   @accounts << BankAccount.new(first_name, last_name)
 end

 def self.find_for(first_name, last_name)
   @accounts.find{|account| account.full_name == "#{first_name} #{last_name}"}
 end
end

这只是一个愚蠢的类,您可以创建以下实例:

class BankAccount
  def initialize(first_name, last_name)
    @balance = 0
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    "#{@first_name} #{@last_name}"
  end
end

self.create_for中,您正在创建一个新帐户,并将其放入变量@accounts,即&#34; global&#34; BankAccounts中的(类变量)。您的新银行帐户实例存储在@accounts中,因此当您使用self.find_for时,它可以查看@accounts以便在那里找到它。

@accounts.find{|account| account.full_name == "#{first_name} #{last_name}"}实质上意味着:

&#34;查看@accounts数组,并查看每个帐户实例(即BankAccount的实例),查看全名是否匹配。 full_name是我可以用来检查BankAccount实例的方法。&#34;

答案 1 :(得分:1)

因为你这样编码。

查看第@accounts << BankAccount.new(first_name, last_name)行。

这意味着@accounts拥有所有BankAccount个对象。现在full_name是类BankAccount的实例的实例方法。

现在在下面一行 -

 @accounts.find { |account| account.full_name == "#{first_name} #{last_name}"}

#find方法将每个此类BankAccount对象(account)传递给块,account正在调用方法full_name,作为班BankAccount

这里没有错。