0

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

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

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

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

4

2 回答 2

2

您正在从 Class 本身调用实例方法,这就是您没有收到方法错误的原因。如果您尝试使用initialize_with准备实例来设置它,那么您应该更改它:

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

对此:

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

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

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

FBRank.new('CAAJzb7....')
于 2013-09-17T15:35:26.007 回答
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)
于 2013-09-17T15:34:17.060 回答