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

我肯定我错过了一些基本的东西,因为我不太使用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

我没有正确实例化什么?我尝试创建一个对象,该对象是此类的实例,但也不起作用,但这可能是因为我做错了…

类方法是通过在
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生态系统中的所有东西都将使用它。