1

我正在使用 Ruby 控制台。我通过使用开始它Rails console,然后确实需要'我的文件的路径',它工作正常。

该文件如下所示:

module App
  module Tools
    module Pollers
      class Kpi
        attr_reader :start_time,:stop_time

        def initialize(start_time,stop_time)
          @start_time = start_time
          @stop_time = stop_time
        end

        def create_social_audiences
        ....

所以我要做的是在控制台中像这样声明停止和开始时间

var end_date = new Date(2012, 7, 1);
var start  = new Date(2012, 5, 1);

然后我尝试在这个文件上调用 .new 并得到这个错误

>> kpi = App::Tools::Pollers::Kpi.new
ArgumentError: wrong number of arguments (0 for 2)
    from (irb):7:in `initialize'
    from (irb):7:in `new'
    from (irb):7
>> 

但奇怪的是,如果我执行这个尝试传递变量的命令,它会起作用:

>> kpi = App::Tools::Pollers::Kpi.new(start , end_date)
=> #<App::Tools::Pollers::Kpi:0x11489e198 @start_time=nil, @stop_time=nil>

但是当我尝试将 varialbes 设置为 nil 以外的任何值时,我得到的错误是 initialize 是一个私有方法:

?> kpi.initialize(start, end_date)
NoMethodError: private method `initialize' called for #<App::Tools::Pollers::Kpi:0x11489e198>
    from (irb):15

关于这里可能发生的错误有什么想法吗?

谢谢!!

4

1 回答 1

4

在类被实例化后,您不应该调用类初始化程序(并且您不能从类本身的外部调用,因为它具有私有可见性)。

以下内容不起作用,因为您有一个带有两个参数的初始化程序,因此您还必须传递这些参数:

kpi = App::Tools::Pollers::Kpi.new

这是有效的,因为在构造类时调用了初始化程序(initialize当您使用创建新实例时始终调用该方法new):

kpi = App::Tools::Pollers::Kpi.new(start , end_date)

最后,以下内容不起作用(无论 start/end_date 持有什么值),因为正如我之前解释的那样,类的初始化程序在 ruby​​ 中是私有的:

 kpi.initialize(start, end_date) # Breaks!

如果要在构建类后修改这些变量,请为此创建一个方法:

def initialize(start, end)
    set_time(start_end)
end

def set_time(start, end)
    @start_time = start
    @end_time = end
end
于 2012-07-09T14:09:59.640 回答