2016-06-02 8 views
0

私は現在コードスクールで勉強していますし、メンターも私たちに自宅の仕事を与えています。手伝って頂けますか?幾何学的図形(点、線、正方形、三角形など)のクラスを作成する(ルビー)

だから、私たちはクラスを経由して、幾何学的図形を作成するように求めていた:私たちはクラスPoint

  • を作成する必要があり、すべての

    1. まず私たちは、クラスのライン(ラインを作成する必要があります - 二つの点が接続されている場合)
    2. 、次のステップ、例えば我々は、正方形

    を作成したいと私はアクセス座標(2D)で、コードに開始し、クラスPointを作成しました:

    class Point 
        attr_accessor :x, :y 
        def initialize 
        @x = 10 
        @y = 10 
        end 
        def x=(value) 
        @x = value 
        end 
        def x() 
        @x 
        end 
        def y=(value) 
        @y = value 
        end 
        def y() 
        @y 
        end 
    end 
    

    たとえば、新しいポイントクラスを作成したいとします。だから、:

    #<Point:0x007f9463089cc0> 
    

    これはどういう意味:

    p = Point.new 
        p.x = 1 
        p.y = 5 
        print p # -> #<Point:0x007f9463089cc0> 
    

    、結果として私はこのようないくつかのことがありますか?

    しかし、私はp.xとp.yを印刷するように要求されます場合 - その後、私は理解結果を持っています:

    print p.x, ", ", p.y # -> 1, 5 
    

    私が何か間違ったことをやっているか、どのように私は、画面上でこの結果を理解することができますか?

    、私は本当にあなたの助けを

    おかげで...これを理解するための助けを必要としてください!

    また、点、線、幾何学図形を作成するために実際のプログラミングジョブで使用されていますか?

  • +0

    「print p」は効果的に 'print p.to_s'を実行します。 'print p.inspect'を試してみてください。 – Raffael

    +0

    @Raffaelあなたが何を意味するのか明確ではありません。そうであれば、無限再帰となります。 – sawa

    答えて

    1

    まず、セッターとゲッターは必要ありません。私はあなたがこれらのメソッドを記述する必要はありません意味:あなたはこの電話を持っているので、あなたはそれらのメソッドを必要としない理由

    def x=(value) 
        @x = value 
        end 
        def x() 
        @x 
        end 
        def y=(value) 
        @y = value 
        end 
        def y() 
        @y 
        end 
    

    理由は次のとおりです。

    ​​

    とその方法(attr_accessor)はありませんまさにあなたのための仕事。

    第2に、コンストラクタにある程度の柔軟性、たとえばinitializeメソッドを使用してxとyの値を渡すことができ、何も渡されなければ10にデフォルト設定することができます。私はそれがだ、任意の引数と、まだxとyの期待通りに設定します両方に合格しない方法P1用

    p1 = Point.new 
    puts p.x # => 10 
    puts p.y # => 10 
    
    p2 = Point.new(15, 20) 
    puts p.x # => 15 
    puts p.y # => 20 
    

    がお知らせ:だからあなたはこの

    def initialize(x = 10, y = 10) 
        @x = x 
        @y = y 
    end 
    

    をこの方法で行うことができます、あなたはこれを取得しますここでは、メソッド定義でそれらのデフォルト値を設定しているので:

    def initialize(x = 10, y = 10) 
    

    を、あなたがこれを見る理由についてご質問について:

    p = Point.new 
    p.x = 1 
    p.y = 5 
    print p # -> #<Point:0x007f9463089cc0> 
    

    ポイント:0x007fa003885bf8は、ポイント(変数pにあるもの)のインスタンスを持つことを意味します。デフォルトでは、オブジェクトを印刷しようとすると、オブジェクトのto_sメソッドが呼び出されます。あなたがそのメソッドを定義しなかった場合、継承チェーンを介して誰がそのメソッドを定義するのかを知ることができます。そのメソッドはObjectクラス(すべてのRubyオブジェクトはObjectクラスから暗黙的に継承されています)にあり、そのメソッドのデフォルトの動作は、クラスの名前のあとにメモリのインスタンスのIDを次の形式で出力することです。 :http://ruby-doc.org/core-2.3.1/Object.html#method-i-to_s

    あなたは、あなたがこのような何かにto_sメソッドをオーバーライドすることができますことを変更する場合:あなたが得る

    def to_s 
        "Point #{x},#{y}" 
    end 
    

    その方法:

    puts Point.new # => Point 10,10 
    

    希望に役立ちます。

    +0

    'p3 = Point.new(15)'を表示し、 '@y'の値を設定したり、' @ x'をデフォルトに設定することはできないことに注意してください。 –

    1

    何も問題はありません。 #<Point:0x007f9463089cc0>は、オブジェクトIDが0x007f9463089cc0Pointクラスのインスタンス(#<>部分)であることを意味します。オブジェクトIDは、各オブジェクトを見つけるためのRubyランタイムの識別子です。メモリアドレスとよく似ています。

    すべては問題ありませんが、Rubyでは常にコードが少なくなっています。例

    class Point 
        attr_accessor :x, :y 
    
        def initialize(x = 10, y = 10) 
        @x, @y = x, y 
        end 
    end 
    

    あるいは

    Point = Struct.new(:x, :y) 
    
    +0

    しかし、このような仕事をする最良の方法は何ですか?私は理解:小さなコード=より良い方法です。しかし、どのような種類のコードでメモリが少なくなるのでしょうか? –

    +0

    @AndreyDrozdovこの場合、 'Point 'クラスを作成するすべての方法はO(1)のメモリを消費するので、メモリ消費量についてはあまり考慮する必要はありません。 )メモリ、または大きなファイルをロードします。 – Aetherus

    0

    あなたが実際にxとyのためのgetterとsetterを定義する必要はありませんattr_accessor :x, :y を宣言しているのでください。 だからあなたのクラスはまた、あなたがそうあなたがputs pを使用していて、

    p = Point.new 
    puts p 
    (10, 10) 
    
    を行う際ouptut (10, 10)として取得することができます

    class Point 
        attr_accessor :x, :y 
        def initialize 
        @x = 10 
        @y = 10 
        end 
    
        def to_s 
        "(#{x}, #{y})" 
        end 
    end 
    

    をポイントする方法to_sを追加することができます

    class Point 
        attr_accessor :x, :y 
        def initialize 
        @x = 10 
        @y = 10 
        end 
    end 
    

    ように簡略化することができます

    ここでは、printの代わりにputsを使用することをお勧めしますw行の文字が出力の後に表示され、より読みやすくなります。 to_sメソッドでは、私はルビの文字列補間"#{}"を使用して、あなたのポイントインスタンス用の素晴らしい出力を構築しています。

    0

    方法printputs出力to_sの結果、及びpinspectの結果を出力します。これらのメソッドを上書きしない限り、デフォルトでObjectを継承するカスタムクラスは、得られたフォーム#<class_name:object_id>を返します。他の出力が必要な場合は、これらのメソッドを上書きしてください。たとえば、

    class Point 
        def to_s 
        "#@x,#@y" 
        end 
    end 
    ... 
    print p 
    
    関連する問題