Ruby 指拉入式包装的方法';当放入objects方法中时,s方法将移出范围

Ruby 指拉入式包装的方法';当放入objects方法中时,s方法将移出范围,ruby,class,variables,methods,scope,Ruby,Class,Variables,Methods,Scope,当我将引用拉入包的方法放在另一个方法中时,它会离开作用域并失败 正确的方法是什么。我试着玩“自我”,但我是新来的,没有成功 理想的解决方案。不起作用。返回错误 nil的未定义方法“accounts”:NilClass(NoMethodError) 这可以工作,但不会创建可重用的方法 require 'package that has 'accounts'' class Name @sandbox = #working API connection @sandbo

当我将引用拉入包的方法放在另一个方法中时,它会离开作用域并失败

正确的方法是什么。我试着玩“自我”,但我是新来的,没有成功

理想的解决方案。不起作用。返回错误

nil的未定义方法“accounts”:NilClass(NoMethodError)


这可以工作,但不会创建可重用的方法

require 'package that has 'accounts''

class Name

    @sandbox = #working API connection


        @sandbox.accounts do |resp|       
          resp.each do |account|    
            if account.name == "John"
                p account.name
            end
          end
        end




end


new = Name.new

要理解这一点,您需要理解Ruby中单例类的概念

类名本身就是一个对象,
@sandbox
是该对象的实例变量

如果您编写
def self.get_account
,您可以在那里使用
@sandox
,但是这种方法对于Name实例不可用,例如,您应该调用
Name.get_account
而不是
Name.new.get_account
。实际上,这为Name的singleton类添加了一个方法,这就是为什么您可以在那里访问@sandbox


要创建一个可以在
Name
实例中使用的实例变量,您应该在
Name
initialize
方法中创建。要理解这一点,您需要理解Ruby中单例类的概念

类名本身就是一个对象,
@sandbox
是该对象的实例变量

如果您编写
def self.get_account
,您可以在那里使用
@sandox
,但是这种方法对于Name实例不可用,例如,您应该调用
Name.get_account
而不是
Name.new.get_account
。实际上,这为Name的singleton类添加了一个方法,这就是为什么您可以在那里访问@sandbox

要创建可在
Name
实例中使用的实例变量,应在
Name
initialize
方法中执行此操作

  • 代码中的错误是@sandbox是类的一个属性。该值将在创建类的对象时初始化。在类中编写初始化将无效@马克西姆在他的回答中解释了这一点

  • 对于第二个代码,当解释器运行代码时,它将执行一次。但该代码不能运行多次

  • 代码应该是

    require 'package that has 'accounts''
    
    
    class Name
    
        def initialize
          @sandbox = #working API connection
        end
    
        def get_account
            @sandbox.accounts do |resp|         #This is where error is
              resp.each do |account|
    
                if account.name == "John"
                    name = account.name
                end
    
              end
            end
        end
    
    
    end
    
    
    new = Name.new
    p new.get_account
    
  • 代码中的错误是@sandbox是类的一个属性。该值将在创建类的对象时初始化。在类中编写初始化将无效@马克西姆在他的回答中解释了这一点

  • 对于第二个代码,当解释器运行代码时,它将执行一次。但该代码不能运行多次

  • 代码应该是

    require 'package that has 'accounts''
    
    
    class Name
    
        def initialize
          @sandbox = #working API connection
        end
    
        def get_account
            @sandbox.accounts do |resp|         #This is where error is
              resp.each do |account|
    
                if account.name == "John"
                    name = account.name
                end
    
              end
            end
        end
    
    
    end
    
    
    new = Name.new
    p new.get_account
    

    您需要
    self.class.instance\u variable\u get(:@sandbox.accounts..
    。也就是说,您需要类实例变量
    @sandbox
    的值,因此首先必须将作用域更改为类:
    self.class
    。(这是需要
    self.
    的情况之一,因为没有它,Ruby会认为
    class
    是一个关键字。)然后,由于类没有
    @sandbox
    的getter,您需要使用该方法。世界上最复杂的$This->您需要
    self.class.instance\u变量\u get(:@sandbox.accounts.
    )。也就是说,您需要类实例变量
    @sandbox
    的值,因此首先必须将作用域更改为类:
    self.class
    。(这是需要
    self.
    的情况之一,因为如果没有它,Ruby会认为
    class
    是一个关键字。)然后,由于类没有
    @sandbox
    的getter,您需要使用该方法。世界上最复杂的$This->
    @sandbox
    的值对于所有实例都是相同的,那么,作为类实例变量是否有意义呢?当然!如果@sandbox作用域是类级别的,那么@sandbox应该在代码中执行此操作。我不确定这种情况下的设计意图。对于类变量,如果他们决定更改特定类的API,以后可能会出现一些可扩展性问题。我建议
    @sandbox
    应该是类实例变量,而不是类变量。(顺便说一句,包括我在内的许多Rubiest从不使用类变量。)哦,对不起,我弄糊涂了。我还添加了@sandbox作为一个实例变量。我误读了评论,认为建议将其作为类变量。我想我们的观点可能是一致的。我有什么误解吗?
    @sandbox
    的值对于所有实例都是相同的,所以作为类实例变量没有意义吗?当然!如果@sandbox作用域是类级别的,那么@sandbox应该在代码中执行此操作。我不确定这种情况下的设计意图。对于类变量,如果他们决定更改特定类的API,以后可能会出现一些可扩展性问题。我建议
    @sandbox
    应该是类实例变量,而不是类变量。(顺便说一句,包括我在内的许多Rubiest从不使用类变量。)哦,对不起,我弄糊涂了。我还添加了@sandbox作为一个实例变量。我误读了评论,认为建议将其作为类变量。我想我们的观点可能是一致的。我是不是误解了什么?