为circle,ruby创建类

时间:2016-06-02 17:22:28

标签: ruby error-handling geometry shapes

这是我关于通过类创建几何形状的第二个问题。

所以,我想创建一个圆圈。

  1. 首先我创建一个Point Point
  2. 然后 - 创建一个类Line,使用两个点(这将是我们的直径)
  3. 现在我们必须计算这些点之间的距离(直径)
  4. 然后我们创建类Circle
  5. 使用直径创建圆圈
  6. 希望,到目前为止一切顺利。但是当我开始编码时,我会遇到一些麻烦。

    创建课程点:

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

    然后,班级线:

    class Line
      attr_accessor :p1, :p2
      def initialize
        @p1 = Point.new
        @p2 = Point.new
      end
      def distance
        @distance = Math::sqrt((@p2.x - @p1.x) ** 2 + (@p2.y - @p1.y) ** 2) # -> rb.16
      end
    end
    

    在Line类中,问题就开始了。如您所知,我想定义方法来计算Line类中各点之间的距离。 thnx到google搜索计算公式是:

    平方根来自((point_2.x - point_1.x)** 2 +(point_2.y - point_1.y)** 2)

    #points
    point_01 = Point.new
    point_01.x = 20
    point_02 = Point.new
    point_02.x = 10
    
    #line
    d = Line.new
    d.p1 = point_01
    d.p2 = point_02
    dis = d.distance # -> rb.40
    print dis
    

    但它给我一个错误:

    rb:16:in `distance': wrong number of arguments (1 for 0) (ArgumentError)
    
    rb:40: in `<top (required)>'
        from -e:1:in `load'
        from -e:1:in `<main>'
    

    这是什么错误,是什么意思?

    下一步是用公式计算周长(C):

    C = Pi *直径

    是吗?

    class Circle
      attr_accessor :diametr, :c
      def initialize
        @diametr = Line.new
      end
      def circle_length
        return @c = @diametr * Math::PI
      end
    end
    #circle
    circle = Circle.new
    circle.diametr = d
    res = circle.circle_length
    

    请注意,我只是在学习,这可能是一个愚蠢的问题,但我仍然不理解。

    感谢您的帮助!

    是的,对于下面的评论,在使用公式计算周长后,错误会出现Circle类。你能帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

我运行了您的代码而我没有收到rb:16:in distance': wrong number of arguments (1 for 0) (ArgumentError)错误。

circle_length方法确实会抛出错误,因为您正在尝试将@diameter乘以Line的实例。

为此,您需要为*实施Line

class Line
  def *(other)
    distance * other
  end
end

进一步说明这里发生了什么:

*与ruby中的任何其他方法一样,具有一些特殊语法。当您执行4 * 5时,您正在*上调用4方法(这只是另一个红宝石对象,Integer的一个实例)并传递5作为它的论点。上面的代码实现/定义*的方法Line,基本上与Integer实现方法*的方式相同。

它以一个数字作为参数,并返回将distance方法的结果乘以参数的结果。