Ruby 如何初始化脚本以避免';你没有名字吗?
我肯定我错过了一些基本的东西,因为我不太使用ruby 我有这样一个类(为了简单起见被截断): 然后我:Ruby 如何初始化脚本以避免';你没有名字吗?,ruby,irb,Ruby,Irb,我肯定我错过了一些基本的东西,因为我不太使用ruby 我有这样一个类(为了简单起见被截断): 然后我: :young-waters-3693[104] > irb 1.9.3p429 :002 > require './ranking' 1.9.3p429 :002 > FBRank.initialize_with('CAAJzb7....') NoMethodError: undefined method `initialize_with' for FBRank:Class
:young-waters-3693[104] > irb
1.9.3p429 :002 > require './ranking'
1.9.3p429 :002 > FBRank.initialize_with('CAAJzb7....')
NoMethodError: undefined method `initialize_with' for FBRank:Class
我没有正确实例化什么?我尝试创建一个对象,该对象是此类的实例,但也不起作用,但这可能是因为我做错了…类方法是通过在
self前面加上前缀来定义的。
:
class FBRank
def self.initialize_with(...)
end
end
但是,您应该返回一个实例,例如:
def self.initialize_with(access_token, photo_rank_weight=150, link_rank_weight=30, post_rank_weight=140, tagged_rank_weight=70, liked_photo_weight=150)
rank = FBRank.new
rank.access_token = access_token
# ...
rank
end
或者更好地使用Ruby的initialize
方法:
def initialize(access_token, photo_rank_weight=150, link_rank_weight=30, post_rank_weight=140, tagged_rank_weight=70, liked_photo_weight=150)
@access_token = access_token
# ...
end
然后,您可以使用以下内容创建一个FBRank
实例:
FBRank.new('CAAJzb7', 150, 30, 140, 70, 150)
使用哈希传递选项也是一个好主意:
def initialize(access_token, options={})
@access_token = access_token
@photo_rank_weight = options.fetch(:photo_rank_weight, 150)
@link_rank_weight = options.fetch(:link_rank_weight, 30)
@post_rank_weight = options.fetch(:post_rank_weight, 140)
@tagged_rank_weight = options.fetch(:tagged_rank_weight, 70)
@liked_photo_weight = options.fetch(:liked_photo_weight, 150)
end
并通过以下方式对其进行初始化:
FBRank.new('CAAJzb7',
photo_rank_weight: 150,
link_rank_weight: 30,
post_rank_weight: 140,
tagged_rank_weight: 70,
liked_photo_weight: 150)
类方法通过在self前面加上前缀来定义。:
class FBRank
def self.initialize_with(...)
end
end
但是,您应该返回一个实例,例如:
def self.initialize_with(access_token, photo_rank_weight=150, link_rank_weight=30, post_rank_weight=140, tagged_rank_weight=70, liked_photo_weight=150)
rank = FBRank.new
rank.access_token = access_token
# ...
rank
end
或者更好地使用Ruby的initialize
方法:
def initialize(access_token, photo_rank_weight=150, link_rank_weight=30, post_rank_weight=140, tagged_rank_weight=70, liked_photo_weight=150)
@access_token = access_token
# ...
end
然后,您可以使用以下内容创建一个FBRank
实例:
FBRank.new('CAAJzb7', 150, 30, 140, 70, 150)
使用哈希传递选项也是一个好主意:
def initialize(access_token, options={})
@access_token = access_token
@photo_rank_weight = options.fetch(:photo_rank_weight, 150)
@link_rank_weight = options.fetch(:link_rank_weight, 30)
@post_rank_weight = options.fetch(:post_rank_weight, 140)
@tagged_rank_weight = options.fetch(:tagged_rank_weight, 70)
@liked_photo_weight = options.fetch(:liked_photo_weight, 150)
end
并通过以下方式对其进行初始化:
FBRank.new('CAAJzb7',
photo_rank_weight: 150,
link_rank_weight: 30,
post_rank_weight: 140,
tagged_rank_weight: 70,
liked_photo_weight: 150)
您正在从类本身调用一个实例方法,这就是您没有得到方法错误的原因。如果您试图使用
initialize\u设置它以准备实例,那么您应该更改此设置:
FBRank.initialize_with('CAAJzb7....')
为此:
FBRank.new.initialize_with('CAAJzb7....')
调用new创建一个新的FBRank实例,然后使用initialize\u和
来配置实例变量;但是,除非将initialize\u设置为在末尾返回self
,否则无法链接此调用并分配这样的变量
尽管创建自己的初始化似乎毫无意义,但只需使用def initialize
,然后将参数传递给new
。毕竟,初始化块的目的是准备一个实例以供使用
FBRank.new('CAAJzb7....')
您正在从类本身调用一个实例方法,这就是您没有得到方法错误的原因。如果您试图使用initialize\u设置它以准备实例,那么您应该更改此设置:
FBRank.initialize_with('CAAJzb7....')
为此:
FBRank.new.initialize_with('CAAJzb7....')
调用new创建一个新的FBRank实例,然后使用initialize\u和
来配置实例变量;但是,除非将initialize\u设置为在末尾返回self
,否则无法链接此调用并分配这样的变量
尽管创建自己的初始化似乎毫无意义,但只需使用def initialize
,然后将参数传递给new
。毕竟,初始化块的目的是准备一个实例以供使用
FBRank.new('CAAJzb7....')
不要使用initialize\u和
,坚持使用initialize
,这样您就可以使用普通的新的
作为初始值设定项。这是Ruby约定,这是语言的工作方式,它与使用initialize\u with
或更好,因为Ruby生态系统中的所有东西都会使用它。不要使用initialize\u with
,坚持使用initialize
,这样你就可以使用普通的new
作为初始值设定项。这是Ruby约定,这是语言的工作原理,它的工作原理与使用initialize\u with
或更好,因为Ruby生态系统中的所有东西都将使用它。