0

私は次のようなモジュールを作成しました。

module One
  class Two
    def self.new(planet)
      @world = planet
    end
    def self.hello
      "Hello, #{@world}"
    end
  end
end

私は次のようにモジュールを操作しようとしていました:

t = One::Two.new("World")
puts t.hello

ただし、明らかに、の範囲にself.helloは含まれていません。t私は次のことができることに気づきました。

t = One::Two
t.new("World")
puts t.hello

前の方法は正しくないと思うので、私は別の方法を探しています。

4

2 に答える 2

1
module One
  class Two
    # use initialize, not self.new
    # the new method is defined for you, it creates your object
    # then it calls initialize to set the initial state.
    # If you want some initial state set, you define initialize.
    # 
    # By overriding self.new, One::Two.new was returning the planet,
    # not an initialized instance of Two.
    def initialize(planet)
      @world = planet
    end

    # because One::Two.new now gives us back an instance,
    # we can invoke it
    def hello
      "Hello, #{@world}"
    end
  end
end

t = One::Two.new 'World'
t.hello # => "Hello, World"
于 2012-06-08T04:00:16.870 に答える
1

クラスのオブジェクトを作成するのではinitializeなく、メソッドを作成する必要があります。そのメソッドを呼び出します。self.newSomeClass.newinitialize

インスタンス変数にアクセスする場合は、インスタンスメソッドを使用してアクセスする必要があります。だから代わりdef self.hellodef hello。クラスメソッドが必要な場合は、クラス変数も使用する必要があります。これを行うには、を@some_var使用する代わりに@@some_var

于 2012-06-08T02:49:21.007 に答える