无法分配方法参数?

时间:2013-01-28 19:09:28

标签: smalltalk pharo

我设计了一个用于发送基本电子邮件的用户界面,可以通过

完成
    SMTPClient  
    deliverMailFrom: sender
to: recipients
text: message
usingServer: '' .

我有一个方法,它将接收来自用户的所有标题的电子邮件。 这是我的方法。

 AddHeader:Headername Email: asString Message:message --> "I want to update this"

 " update is nothing but adding dictionay values to that "
|data|
 data:= Dictionary new.
 'To'= Headername ifTrue[data at:#To put:Email.].
 'From'= Headername ifTrue[data at: #From put:Email].
 'subject'= Headername ifTrue[data at: #subject put:Email].

"adding dicitonay values to message"
message:= String streamContents:[:stream|
data values do:[:each| stream nextPutAll: each ]
    separatedBy: [ stream nextPut: Character space ]].

当我尝试保存此方法时,我收到错误消息,指出无法存储到消息中。那么有什么方法可以将值添加到已经定义的消息中。

字典中添加的其他值不会按照它们的顺序添加。那么有没有办法可以添加这些值,以便它们被放置为首先,从下一个,然后主题..

1 个答案:

答案 0 :(得分:2)

我不知道您是在问这个错误,还是在尝试在代码的基础上实现其他目标。由于代码分散且不完整,我无法给你一个正确的答案,但我会修改一个类似于你的代码,它似乎有效:

|data|
data:= Dictionary new.
('To'= 'To') ifTrue: [data at:#To put:'someone@mail.com'].
('To'= 'Another thing') ifTrue: [data at:#To put:'shouldnt appear'].
data at:#From put:'me@mail.com'.

message:= String streamContents:
            [:stream|
                    data values 
                            do:[:each| stream nextPutAll: each ]
                            separatedBy: [ stream nextPut: Character space ]].

如果您在工作区中复制此内容并检查data内容,则会为您提供以下ByteString 'someone@mail.com me@mail.com'。但我认为你已经完成了这项任务。你能详细说明一下你在寻找什么并把完整的代码放在一边吗?

根据OP澄清进行编辑

好的,现在我看到了问题。问题是在Smalltalk中你没有“out”参数,这就是编译器告诉你它不能在message参数中存储新内容的原因。从发送消息的对象的角度来看,您会看到该消息发送为告知对象执行操作并将所需的协作者传递给该对象以执行该操作。如果发送消息的响应,则预计它将在返回值中。我在这里重新编写了你的​​方法:

addHeader: headerName email: aString message: aMessage 

| data newValues |

 data:= Dictionary new.
 'To'= headerName ifTrue: [data at:#To put: aString.].
 'From'= headerName ifTrue: [data at: #From put: aString].
 'subject'= headerName ifTrue: [data at: #subject put: aString].

"adding dicitonay values to message"
newValues := String streamContents:[:stream|
data values do:[:each| stream nextPutAll: each ]
    separatedBy: [ stream nextPut: Character space ]].
^aMessage  , newValues.

您可以看到想法是使用#,消息加入两个字符串并返回新值。这里要注意的一些事情是:

  1. 我改变了一些名称,使用了更为公认的大写模式。
  2. 您可能需要查看#asSymbol消息以避免使用if语句。
  3. HTH