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>

しかし、変数を nil 以外に設定しようとすると、初期化はプライベート メソッドであるというエラーが表示されます。

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

ここで何が間違っているのかについて何か考えはありますか?

ありがとう!!

4

1 に答える 1

4

クラスがインスタンス化された後は、クラス初期化子を呼び出さないでください (プライベートな可視性があるため、クラス自体の外部から呼び出すことはできません)。

2 つのパラメーターを持つイニシャライザーがあるため、以下は機能しません。したがって、それらも渡す必要があります。

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

これが機能するのは、クラスの構築時にイニシャライザが呼び出されるためです (initializeメソッドは、 を使用して新しいインスタンスを作成するときに常に呼び出されますnew)。

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

最後に、前に説明したように、Ruby ではクラスの初期化子がプライベートであるため、次の例は (start/end_date の値に関係なく) 機能しません。

 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 に答える