2017-09-18 9 views
0

私はこれに対する答えを検索しましたが、同様の問題がたくさんありますが、ここで間違っていることはまだ分かりません。私はRubyクラスを宣言し、新しいインスタンスを作成しようとしましたが、そのインスタンスのインスタンスメソッドをいくつか呼び出すので、なぜ私の起動メソッドでNoMethodErrorを取得できますか?グローバルスコープからインスタンスメソッドを呼び出すときにNoMethodErrorが発生するのはなぜですか?

class MyClass 

    def initialize 
    self.class.reset 
    end 

    def self.reset 
    ... 
    end 

    def self.start(port) 
    ... 
    end 
end 

test = MyClass.new 
test.start '8082' <- here <- undefined method `start' for #<MyClass:0x2f494b0> (NoMethodError) 

ご覧のとおり、私はRuby noobです。どんな助けもありがとう。私はクラス構造を変えることができますが、ここで間違っていることを本当に理解したいと思います。

+10

'MyClass :: start'はインスタンスメソッドではなく(' def self'start'で、 'def start'ではなく)、クラスメソッドですので、' MyClass.start'が呼び出されます。 –

+0

@CarySwovelandうわー、私は本当にこれについて間違った方法を考えています。説明してくれてありがとうございます(私は通常C++を使用していますので、これははるかに異なります)。それがうまくいきました。答えとして投稿すると私は受け入れます。 –

答えて

0

ここでstartはクラスメソッドです。

あなたの現在のアプローチによって、あなたは次のよう

MyClass.start '8080'

でそれを使用することができますしかし、あなたはclassinstance上でそれを使用したい場合は、次のコード

class MyClass 

    def initialize 
    self.class.reset 
    end 

    def self.reset 
    ... 
    end 

    def start(port) 
    ... 
    end 
end 

test = MyClass.new 
test.start '8080' 
+1

'reset'はおそらくインスタンスメソッドでなければなりません。 – Stefan

+0

おそらく、両方の場合に '自己 'の意義とその意味を説明するべきでしょう。 –

0

はあなたを使用しますクラス変数としてstartを使用している場合、self-keywordの前にあるメソッド名はそれらのメソッドをClassメソッドとして作成します。だから、あなたが本当にあなたのクラスを変更しないようにしたいならば、あなたはこのようにそれを呼び出す必要があります:

MyClass.start「8080」

エルス

あなたがリセットから自己を削除し、メソッドを起動して行うことができますインスタンスメソッドとしてそれらととしてそれらを使用します。

テスト= MyClass.new

test.start '8082'

関連する問題