【问题标题】:Creating class for circle, ruby为圆创建类,红宝石
【发布时间】:2016-06-02 17:22:28
【问题描述】:

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

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

  1. 首先我创建了一个Point类
  2. 然后 - 创建一个 Line 类,使用两个点(这将是我们的直径)
  3. 现在我们必须计算这些点之间的距离(直径)
  4. 然后我们创建类 Circle
  5. 并使用直径创建一个圆

希望,到目前为止一切顺利。但是当我开始编码时,我遇到了一些麻烦。

创建类点:

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 to google search 计算公式为:

((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 类。你能帮我解决这个问题吗?

【问题讨论】:

  • 我运行了您的代码,但没有收到 rb:16:in distance': wrong number of arguments (1 for 0) (ArgumentError) 错误。
  • 为什么除了中心点和半径之外还需要其他任何东西来识别圆?
  • @Keith Bennett 以及我们如何创建一个没有半径的圆?
  • 是不是你从一条线开始,你必须创建一个以它为直径的圆?
  • @AndreyDrozdov 我不明白。我建议可以通过圆心半径来识别圆。

标签: ruby error-handling geometry shapes


【解决方案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(这只是另一个ruby 对象,Integer 的一个实例)上的* 方法,并将5 作为其参数传递。上面的代码为Line实现/定义了一个方法*,本质上与Integer实现方法*的方式相同。

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

【讨论】:

  • 不确定你写的代码是什么意思?以及我以后如何调用此方法?
  • * 与 ruby​​ 中的任何其他方法一样,具有一些特殊的语法。当您执行4 * 5 时,您正在调用4 上的* 方法(这只是另一个ruby 对象,以及Integer 的实例),并将5 作为它的参数传递。我编写的代码为Line 实现/定义了一个方法*,基本上与Integer 实现方法* 的方式相同。它将一个数字作为参数,并返回将其距离属性乘以该数字的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多