具有多个参数的 Pharo 方法

  • 本文关键字: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;问问自己是否可以在那里简化一些东西(在不知道你想做什么的情况下很难更具体)

你写的是正确的,但MethodName是额外的,然后你的方法看起来像这样:

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

这是一个 2 arg 方法。你可以用同样的方式编写 3 arg 方法:

arg1: argValue1 arg2: argValue2 arg3: argValue3
  ^ self var1: argValue1 var2: self var3: argValue2

然后你正在做的是调用另一个 3 arg 类方法#var1:var2:var3:参数:argValue1selfargValue2(我希望这是你的意图,因为这看起来很奇怪)。

最新更新