如何初始化我的脚本以便我没有得到NoM​​ethodError?

时间:2013-09-17 15:31:08

标签: ruby irb

我确定我遗漏了一些基本的东西,因为我没有那么多使用红宝石。

我有这个类(为简单起见而截断):

require 'koala'
require 'time'
class FBRank
    def initialize_with(access_token, photo_rank_weight=150, link_rank_weight=30, post_rank_weight=140, tagged_rank_weight=70, liked_photo_weight=150)
        puts "hello?"
        @graph_api = Koala::Facebook::API.new(access_token)
        @photo_rank_weight = photo_rank_weight
        @link_rank_weight = link_rank_weight        
        @post_rank_weight  = post_rank_weight
        @tagged_rank_weight = tagged_rank_weight
        @liked_photo_weight = liked_photo_weight
    end
end

然后我:

: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

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

2 个答案:

答案 0 :(得分:2)

通过预先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)

答案 1 :(得分:2)

您正在从类本身调用实例方法,这就是您没有遇到方法错误的原因。如果您尝试使用initialize_with进行设置以准备实例,那么您应该更改此内容:

FBRank.initialize_with('CAAJzb7....')

到此:

FBRank.new.initialize_with('CAAJzb7....') 

调用new创建一个新的FBRank实例,然后使用initialize_with配置实例变量;但是,除非您将initialize_with设置为最后返回self,否则您将无法链接此调用并分配此类变量。

虽然创建自己的初始化看起来毫无意义,但只需使用def initialize然后将参数传递给new。毕竟,初始化块的目的是准备一个实例供使用。

FBRank.new('CAAJzb7....')