首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Smalltalk中用浮点数对整数进行乘法

如何在Smalltalk中用浮点数对整数进行乘法
EN

Stack Overflow用户
提问于 2016-11-20 02:52:19
回答 1查看 989关注 0票数 2

我学习Smalltalk几天前,我正在工作的项目,基本上是找到的区域和周长的圆环类,正在实现的形状类。换句话说,形状是圆圈的一个超类。

当我运行我的代码时,我会看到一个错误,上面写着“数字基元期望的数值参数,got”。我认为这个错误的发生是因为我正在用浮点数乘以整数。我不知道如何纠正错误,所以如果有人能给我一些建议吗?

P.S -我正在使用usmalltalk,它是Smalltalk的一个特定版本,但是它具有相同的特性。

代码语言:javascript
运行
复制
(class Shape Object 
   (Perimeter Area)
   (method getPerimeter() Perimeter)

   (method setPerimeter:(Perim)
       (set Perimeter Perim) 
   )


   (method CreateShape::(Perim Ar)
      (set Perimeter Perim)
      (set Area Ar)
      self
   )

   (class-method NewShape:: (Perimeter Area)
        (CreateShape:: (new self) Perimeter Area)
    )
)


(class Circle Shape
   (Radius)

   (method getRadius() Radius)

   (method setRadius:(radi)
       (set Radius radi)
       (set Perimeter (* (* 2 (asFloat (/ 22 7))) Radius)) #The error exits here
       (set Area (* (* (asFloat (/ 22 7)) Radius) Radius))
   )

   (method CreateCircle:(radi)
       (set Radius radi)
       self
   )

   (class-method NewCircle: (Radius)
       (CreateCircle: (new self) Radius)
   )

)
EN

回答 1

Stack Overflow用户

发布于 2016-11-20 14:22:07

您使用的Smalltalk方言不遵循传统的Smalltalk语法,所以让我将这个冒犯性的表达式翻译成更熟悉的表达式。

让我们解析表达式

代码语言:javascript
运行
复制
(* (* 2 (asFloat (/ 22 7))) Radius)

在下面的内容中,-->右侧的表达式是左侧表达式的常规形式。

步骤1:

代码语言:javascript
运行
复制
/ 22 27 --> 22/27

第2步:

代码语言:javascript
运行
复制
asFloat(/ 22 7) --> (22/27) asFloat

第3步:

代码语言:javascript
运行
复制
* 2 (asFloat (/ 22 27)) --> 2 * (22/27) asFloat

第4步:

代码语言:javascript
运行
复制
* (* 2 (asFloat (/ 22 27)) Radius) --> (2 * (22 / 27) asFloat) * Radius

因此,这里的错误意味着Radius不是一个数字。正如注释中所建议的那样,问题是没有为Radius变量分配一个适当的(即数值)值,这就是错误消息试图告诉的内容。

当然,Radius变量的值来自发送给setRadius:方法的radi参数。这意味着问题的根源在于setRadius:的发送方。但是这里是源代码分析变得棘手的地方,因为它是静态的,它没有显示程序执行过程中的步骤序列。

更好地理解这个问题的方法是动态的。在Smalltalk中,您可以在调试器的帮助下这样做。我不熟悉您正在使用的Smalltalk方言,但是当错误弹出时,应该提供一些调试代码的方法。接受该选项,并检查在发出错误信号之前发送的消息列表。在步骤4找到计算表达式的方法之后,检查Radius变量的值并查看其中的内容。它不应该是一个数字,否则就不会有任何错误。在那里,您应该能够追溯到形式参数radi获取其实际值的位置,这将导致问题的根源。

最后一句话。您的问题是如何在Smalltalk中用浮点数乘法整数。答案是使用将它们相乘Smalltalk会想出如何继续下去的。您不需要发送任何转换消息,如asFloat等(您可以将它们从代码中删除,以便简化)。Smalltalk动态类型可以使程序员不用花时间在类型转换变量中。不是因为编译器有任何魔力,而是因为语言的多态性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40700193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档