Ruby 指拉入式包装的方法';当放入objects方法中时,s方法将移出范围
当我将引用拉入包的方法放在另一个方法中时,它会离开作用域并失败 正确的方法是什么。我试着玩“自我”,但我是新来的,没有成功 理想的解决方案。不起作用。返回错误 nil的未定义方法“accounts”:NilClass(NoMethodError)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
这可以工作,但不会创建可重用的方法
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
方法中执行此操作
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
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作为一个实例变量。我误读了评论,认为建议将其作为类变量。我想我们的观点可能是一致的。我是不是误解了什么?