我确定我遗漏了一些基本的东西,因为我没有那么多使用红宝石。
我有这个类(为简单起见而截断):
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
我没有正确实例化什么?我尝试创建一个对象,该对象是这个类的一个实例但是也没有用,但那可能是因为我做错了...
答案 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....')