具有多个参数的 Pharo 方法

标签 pharo

我正在创建一个带有 3 个参数的 Pharo 类方法。我正在使用以下代码,它给了我错误“预期的变量或表达式..”

    MethodName: arg1:argValue1 arg2:argValue2
    ^ self var1: argValue1 var2: self var3: argValue2

正确的方法声明语法是什么?稍后,我打算像下面这样调用这个方法:
    ClassName var1: argValue1 var2: self var3: argValue2

最佳答案

在 Smalltalk 中命名方法时,您必须了解的一点是,该方法可以拆分为多个部分,以冒号 ( : ) 分隔,并且在每个冒号之后插入参数。从语义上讲,这很有意义,并且允许您使用良好的命名实践,以便您的代码读起来几乎像一个英文句子(这就是该语言被命名为 Smalltalk 的原因)。

因此,对于在 Java 或类似的“大括号语言”中的方法,可能如下所示:

registerUser(String emailAddress, String password, boolean isAdmin) {...}

您将在声明中拆分方法名称以适合参数,如下所示:
registerUserWithEmail: anEmailAddress password: aPassword isAdmin: aBoolean

制作方法名称(在 Smalltalk 中通常以 # 为前缀,因为它在全局字典中注册为“符号”):
#registerUserWithEmail:password:isAdmin:

整个事情就是方法名称,在调用它时,您需要在冒号后插入适当的参数(假设此方法在类 UserRegistry 中定义):
UserRegistry
    registerUserWithEmail: 'joe@bloggs.com'
    password: 'topSecret'
    isAdmin: true

当然,您可以将所有内容放在一行上,具体取决于其长度和您的可读性偏好。

回到你的案例,你有这个:
MethodName: arg1:argValue1 arg2:argValue2

当您的编译器说“预期的变量或表达式”时,它试图提醒您的问题是 MethodName: 之间没有任何内容。和 arg1: .我想你可能已经假设 MethodName:不是方法名称的一部分,而是定义的一部分。

一些注意事项:
  • 按照惯例,方法名称使用小驼峰大小写
  • #methodName:arg1:arg2:在 Smalltalk 中不会成为一个很好的方法名称,因为名称应该描述它的作用,以及当参数起作用时,需要什么参数; #var1:var2:var3: 也是如此
  • 如果您要通过向 ClassName 发送消息来调用此方法,那么该方法需要在 ClassName 的类端定义,不在实例端
  • 考虑一下您在示例中调用/传递的内容 - 除非您正在对对象层次结构进行复杂的操作,否则向 self 发送消息可能没有多大意义。其中一个参数是 self同样;问问自己是否可以在那里简化一些事情(如果不知道您要做什么,很难更具体)
  • 关于具有多个参数的 Pharo 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30793942/

    相关文章:

    smalltalk - Pharo:引用类名而不是 "self class"

    smalltalk - Spec - 带有进度条的水平面板占据了中间的所有空间

    smalltalk - 双屏 Pharo/Squeak 环境

    syntax-error - 拖入文件时在pharo中出现语法错误

    smalltalk - 在 smalltalk 中退出程序?

    smalltalk - Pharo 上的双引号

    parsing - 在哪里可以找到使用PetitParser的更多示例?

    smalltalk - 需要有关 Pharo 中的 UserInterface Creator 的信息

    dictionary - 如何在 Smalltalk 中按值对字典进行排序?

    tar - 如何从 Pharo Smalltalk 解压文件?