关于Ruby本地和实例/类变量的范围?

时间:2016-01-28 22:29:34

标签: ruby class variables scope instance

我有一个用于模拟的脚本:

  def winner_client
    clients = [@client1, @client2, @client3]
    @winner = clients.find { |drunkest| drunkest.drunk == 3 }.name
    puts "#{@winner} is too drunk!"
    Bouncer.kick(@winner)
  end
end

winner_client方法中,我希望clients数组在类级别工作,以便我可以在其他方法中使用它。但如果我这样做:

class OpenBar
  @@clients = [@client1, @client2, @client3]

  def initialize
   #...

当我调用winner_client方法时,它会引发

KatzBar.rb:57:in block in winner_client': undefined method drunk' for nil:NilClass (NoMethodError)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您想定义clients以便它可以在多种方法中使用,那么您可以将其作为一种方法...

def clients
  [@client1, @client2, @client3]
end

这将使它可用于同一实例的所有方法。

如果您希望它可用于所有实例,那是一个不同的问题,但仍然可以。创建一个类方法来设置和获取客户......

def self.clients=(array)
  @@clients = array
end

def self.clients
  @@clients
end

如果在一个实例中有方法,则可以使用...

保存客户端
OpenBar.clients = [@client1, @client2, @client3]

在另一个实例中,您可以使用...

访问它
OpenBar.clients