具有多个参数的Pharo方法

时间:2015-06-12 01:23:50

标签: pharo

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

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

正确的方法声明语法是什么?稍后,我打算像下面这样调用这个方法:

    ClassName var1: argValue1 var2: self var3: argValue2

2 个答案:

答案 0 :(得分:4)

在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:不是方法名称的一部分,而是定义的一部分。

一些注意事项:

  • 按照惯例,方法名称使用lowerCamelCase
  • #methodName:arg1:arg2:不会在Smalltalk中创建一个非常好的方法名称,因为名称应该描述它的作用,并且当参数发挥作用时,预期会有什么参数; #var1:var2:var3:
  • 也是如此
  • 如果您要通过向ClassName发送消息来调用此方法,则需要在ClassName的类侧定义该方法,而不是在实例端定义
  • 想想你在你的例子中调用/传递的内容 - 除非你正在做一些复杂的对象层次结构,否则使用其中一个参数向self发送消息可能没什么意义也是self;问自己是否可以简化那里的事情(很难在不知道你想要做什么的情况下更具体)

答案 1 :(得分:2)

您所写的内容是正确的,但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(我希望这是你的意图,因为这看起来奇怪的)。