我正在创建一个带有 3 个参数的 Pharo 类方法。我正在使用以下代码,它给了我错误“预期的变量或表达式..”
MethodName: arg1:argValue1 arg2:argValue2
^ self var1: argValue1 var2: self var3: argValue2
Run Code Online (Sandbox Code Playgroud)
正确的方法声明语法是什么?稍后,我打算像下面这样调用这个方法:
ClassName var1: argValue1 var2: self var3: argValue2
Run Code Online (Sandbox Code Playgroud)
在 Smalltalk 中命名方法时,您必须了解的一点是,该方法可以分成多个部分,由冒号 ( :)分隔,并且参数插入在每个冒号之后。从语义上讲,这很有意义,并且允许您使用良好的命名实践,以便您的代码读起来几乎像一个英文句子(这就是该语言被命名为Smalltalk 的原因)。
因此,对于在 Java 或类似的“大括号语言”中的方法,可能如下所示:
registerUser(String emailAddress, String password, boolean isAdmin) {...}
Run Code Online (Sandbox Code Playgroud)
您将在声明中拆分方法名称以适合参数,如下所示:
registerUserWithEmail: anEmailAddress password: aPassword isAdmin: aBoolean
Run Code Online (Sandbox Code Playgroud)
制作方法名称(#在 Smalltalk 中通常以前缀为前缀,因为它在全局字典中注册为“符号”):
#registerUserWithEmail:password:isAdmin:
Run Code Online (Sandbox Code Playgroud)
整个事情就是方法名称,在调用它时,您需要在冒号后插入适当的参数(假设这个方法是在类中定义的UserRegistry):
UserRegistry
registerUserWithEmail: 'joe@bloggs.com'
password: 'topSecret'
isAdmin: true
Run Code Online (Sandbox Code Playgroud)
当然,您可以将所有内容放在一行上,具体取决于其长度和您的可读性偏好。
回到你的案例,你有这个:
MethodName: arg1:argValue1 arg2:argValue2
Run Code Online (Sandbox Code Playgroud)
当您的编译器说“预期的变量或表达式”时,它试图提醒您的问题是MethodName:和之间没有任何内容arg1:。我想您可能已经假设这MethodName:不是方法名称的一部分,而是定义的一部分。
一些注意事项:
#methodName:arg1:arg2:在 Smalltalk 中不会成为一个很好的方法名称,因为名称应该描述它的作用,以及当参数起作用时,需要什么参数;也一样#var1:var2:var3:ClassName,则需要在 的类端而ClassName不是实例端定义该方法self带有其中一个参数的消息可能没有多大意义self;问问自己你是否可以在那里简化一些事情(如果不知道你想要做什么,很难更具体)| 归档时间: |
|
| 查看次数: |
3604 次 |
| 最近记录: |