具有多个参数的 Pharo 方法
Pharo method with multiple arguments
我正在创建一个带有 3 个参数的 Pharo Class 方法。我正在使用以下代码,它给了我错误 "Variable or expression expected.."
MethodName: arg1:argValue1 arg2:argValue2
^ self var1: argValue1 var2: self var3: argValue2
正确的方法声明语法是什么?稍后,我打算像下面这样调用这个方法:
ClassName var1: argValue1 var2: self var3: argValue2
你写的是正确的,但是 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 class 方法 #var1:var2:var3:
:argValue1
、self
、argValue2
(我希望这个是你的意图,因为这看起来很奇怪)。
在 Smalltalk 中命名方法时,您必须了解的一点是方法可以拆分为多个部分,以冒号分隔 (:
),并且参数插入在每个部分之后那些冒号。从语义上讲,这很有意义,并且允许您使用良好的命名习惯,这样您的代码读起来几乎就像一个英语句子(这就是该语言被命名为 Smalltalk 的原因)。
因此,对于 Java 或类似 "curly bracket language" 中的方法,可能看起来像这样:
registerUser(String emailAddress, String password, boolean isAdmin) {...}
您可以拆分声明中的方法名称以适合参数,如下所示:
registerUserWithEmail: anEmailAddress password: aPassword isAdmin: aBoolean
制作方法名(在Smalltalk中通常以#
为前缀,因为它在全局字典中注册为"symbol"):
#registerUserWithEmail:password:isAdmin:
整个就是方法名,调用它时,你会在冒号后插入适当的参数(假设这个方法定义在 class UserRegistry
中):
UserRegistry
registerUserWithEmail: 'joe@bloggs.com'
password: 'topSecret'
isAdmin: true
当然,您可以将所有内容放在一行中,具体取决于它的长度和您的可读性偏好。
回到你的案例,你有这个:
MethodName: arg1:argValue1 arg2:argValue2
您的编译器在显示 "Variable or expression expected" 时试图提醒您的问题是 MethodName:
和 arg1:
之间没有任何内容。我认为您可能已经假设 MethodName:
不是 方法名称 的一部分,而是定义的一部分。
一些注意事项:
- 按照惯例,方法名称使用 lowerCamelCase
#methodName:arg1:arg2:
在 Smalltalk 中不会成为一个很好的方法名称,因为名称应该描述它的作用,以及当参数发挥作用时,预期的参数是什么; #var1:var2:var3:
也是如此
- 如果您要通过向
ClassName
发送消息来调用此方法,则需要在 ClassName
的 class 端定义该方法,而不是实例端
- 想想你在你的例子中是什么 calling/passing - 除非你正在做一些复杂的对象层次结构的事情,否则向
self
发送消息可能没有多大意义其中一个参数也是 self
;问问自己是否可以在那里简化一些事情(在不知道你想做什么的情况下很难更具体)
我正在创建一个带有 3 个参数的 Pharo Class 方法。我正在使用以下代码,它给了我错误 "Variable or expression expected.."
MethodName: arg1:argValue1 arg2:argValue2
^ self var1: argValue1 var2: self var3: argValue2
正确的方法声明语法是什么?稍后,我打算像下面这样调用这个方法:
ClassName var1: argValue1 var2: self var3: argValue2
你写的是正确的,但是 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 class 方法 #var1:var2:var3:
:argValue1
、self
、argValue2
(我希望这个是你的意图,因为这看起来很奇怪)。
在 Smalltalk 中命名方法时,您必须了解的一点是方法可以拆分为多个部分,以冒号分隔 (:
),并且参数插入在每个部分之后那些冒号。从语义上讲,这很有意义,并且允许您使用良好的命名习惯,这样您的代码读起来几乎就像一个英语句子(这就是该语言被命名为 Smalltalk 的原因)。
因此,对于 Java 或类似 "curly bracket language" 中的方法,可能看起来像这样:
registerUser(String emailAddress, String password, boolean isAdmin) {...}
您可以拆分声明中的方法名称以适合参数,如下所示:
registerUserWithEmail: anEmailAddress password: aPassword isAdmin: aBoolean
制作方法名(在Smalltalk中通常以#
为前缀,因为它在全局字典中注册为"symbol"):
#registerUserWithEmail:password:isAdmin:
整个就是方法名,调用它时,你会在冒号后插入适当的参数(假设这个方法定义在 class UserRegistry
中):
UserRegistry
registerUserWithEmail: 'joe@bloggs.com'
password: 'topSecret'
isAdmin: true
当然,您可以将所有内容放在一行中,具体取决于它的长度和您的可读性偏好。
回到你的案例,你有这个:
MethodName: arg1:argValue1 arg2:argValue2
您的编译器在显示 "Variable or expression expected" 时试图提醒您的问题是 MethodName:
和 arg1:
之间没有任何内容。我认为您可能已经假设 MethodName:
不是 方法名称 的一部分,而是定义的一部分。
一些注意事项:
- 按照惯例,方法名称使用 lowerCamelCase
#methodName:arg1:arg2:
在 Smalltalk 中不会成为一个很好的方法名称,因为名称应该描述它的作用,以及当参数发挥作用时,预期的参数是什么;#var1:var2:var3:
也是如此
- 如果您要通过向
ClassName
发送消息来调用此方法,则需要在ClassName
的 class 端定义该方法,而不是实例端 - 想想你在你的例子中是什么 calling/passing - 除非你正在做一些复杂的对象层次结构的事情,否则向
self
发送消息可能没有多大意义其中一个参数也是self
;问问自己是否可以在那里简化一些事情(在不知道你想做什么的情况下很难更具体)