这是我关于通过类创建几何形状的第二个问题。
所以,我想创建一个圆圈。
希望,到目前为止一切顺利。但是当我开始编码时,我会遇到一些麻烦。
创建课程点:
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类。你能帮我解决这个问题。
答案 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
方法的结果乘以参数的结果。