smalltalk - 如何在 Smalltalk 中将整数与浮点值相乘

标签 smalltalk multiplication

几天前我正在学习 Smalltalk,我正在开发一个项目,该项目基本上是找到从形状类实现的圆形类的面积和周长。换句话说,Shape 是 Circle 的父类(super class)。

当我运行代码时,我收到错误消息“数字基元预期数字参数,得到”。我相信发生错误是因为我将整数与浮点值相乘。我不知道如何修复该错误,所以如果有人可以给我一些建议吗?

P.S - 我使用的是 usmalltalk,它是 Smalltalk 的特定版本,但具有相同的功能。

(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)
   )

)

最佳答案

您使用的 Smalltalk 方言不遵循传统的 Smalltalk 语法,因此让我将有问题的表达式翻译为更熟悉的表达式。

让我们解析表达式

(* (* 2 (asFloat (/ 22 7))) Radius)

接下来,-->右边的表达式是左边表达式的约定形式。

第 1 步:

/ 22 27 --> 22/27

第 2 步:

asFloat(/ 22 7) --> (22/27) asFloat

第 3 步:

* 2 (asFloat (/ 22 27)) --> 2 * (22/27) asFloat

第 4 步:

* (* 2 (asFloat (/ 22 27)) Radius) --> (2 * (22 / 27) asFloat) * Radius

因此,这里的错误意味着Radius不是一个数字。正如评论中所建议的,问题是 Radius 变量尚未分配适当的(即数字)值,这就是错误消息试图告诉我们的内容。

当然,Radius 变量从发送到 setRadius: 方法的 radi 参数中获取其值。这意味着问题的根源在于setRadius:的发送者。但这里是源代码的分析变得棘手的地方,因为它是静态的,并且不显示程序执行的步骤顺序。

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

最后一句话。您的问题是如何在 Smalltalk 中将整数与 float 相乘。答案是只需使用*将它们相乘即可。 Smalltalk 会弄清楚如何继续。您不需要发送任何转换消息,例如 asFloat 等(您可以将它们从代码中删除以简化代码。)Smalltalk 动态类型使程序员无需花费时间进行类型转换变量。不是因为编译器有什么魔力,而是因为语言的多态性。

关于smalltalk - 如何在 Smalltalk 中将整数与浮点值相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40700193/

相关文章:

smalltalk - FileSystem磁盘方法在哪里?

c++ - 俄罗斯农民乘法算法的时间复杂度?

c - C 中的 MUL(汇编程序)

bit-manipulation - 如何使用按位运算符执行乘法?

c++ - 为什么 int/float 乘法会导致不同的结果?

php - PHP中的移位与乘法

smalltalk - pharo - 在服务器启动时运行代码

smalltalk - Pharo:我可以手动而不是按字母顺序对协议(protocol)中的方法进行排序吗?

keyboard-shortcuts - 如何在 Pharo/Squeak 中缩进一段代码?

smalltalk - 吱吱小声 : Why reduction of a fraction does not happen after numerator and denominator values are modified in the inspect window?