2016-05-25 1 views
0

私はRubyの初心者です。
このコードを実行しようとしましたが、実行時エラーが表示されます。
このコードで何が問題になっていますか?Rubyの初心者が手を必要とする

class Calc 
    attr_accessor :val1, :val2 
    def initialize (val1,val2) 
    @val1=val1 
    @val2=val2 
    end 
end 
a=Calc.new(2,3) 
a.add_two_numbers(3) 

def add_two_numbers(v3) 
    return @[email protected]+v3 
end 
+4

あなたはクラス本体の中にメソッドを置くべきです – Ilya

+1

ところで、Rubyではreturnキーワードを使う必要はありません。 Rubyはデフォルトで最後に計算された値を返します。 – Alex

+0

'add_two_numbers' - なぜ「two」ですか? – Stefan

答えて

5

方法add_two_numbersは、それがあるかのように、しかし、あなたがそれを使用している、クラスCalcに定義されていません。これが問題です。

NoMethodErrorがあると思います。

更新:コメントで指摘したように、actuallityに、方法はなく、民間のように、その後、自動すべてのクラスに継承された取得しますデフォルトでObjectクラスに定義されています。これは、実際には、プライベートメソッドが呼び出されているというエラーが表示されることを意味します。最も重要な問題は、クラスとそのメソッドを定義する方法が混乱するためです。

解決方法は、クラス本体にクラスを入れることによってクラスにメソッドを定義することです。

class Calc 
    attr_accessor :val1, :val2 
    def initialize (val1,val2) 
    @val1=val1 
    @val2=val2 
    end 

    def add_two_numbers(v3) 
    return @[email protected]+v3 
    end 
end 
+5

トップレベルで定義されたメソッドは、 'Object'のプライベートインスタンスメソッドになります。したがって、メソッドは実際には 'Calc'のスーパークラス' Object'から継承して定義されていますが、プライベートなので、明示的な受信機では呼び出せません。あなたの解決策は正しいですが、説明は不完全です。 –

+0

@JörgWMittagあなたが正しいのですが、私はこのルールに気づいておらず、適切に考慮していませんでした –

0

だから、あなたは(私たちは望んでいないしたい場合)、クラスの外でメソッドを定義している

def add_two_numbers(v3) 
return @[email protected]+v3 
end 

あなたはいつもあなたは2通りのロジックをあなたのクラスを維持し、あなたのことを確認します組織の面で別個のエンティティ。それによって私は意味:

**class Calc 
     attr_accessor :val1, :val2 
     def initialize (val1,val2) 
     @val1=val1 
     @val2=val2 
    end 
     def add_two_numbers(v3) 
     return @[email protected]+v3 
     end 
    end** 

、別のファイルにcalc.rbにアクセスするには、あなたのロジック:1つのファイル(calc.rb)で

あなたのクラスを。

require_relative"/calc.rb" 
a=Calc.new(2,3) 
a.add_two_numbers(3) 

ヒント:使用すると、クラスファイル内のロジックにアクセスするために相対的な必要が私はあなたが持っていない知って、より良いorganization.That方法のための2つの別々のファイルにそれらを保つためにルビーに最善の方法を学んでいたときクラスの外のどこかのメソッド。これは、あなたの "方法のエラー"を避けるでしょう

関連する問題