On Wednesday, 16 March 2016 at 20:08:40 UTC, Suliman wrote:
I can't understand how to get works delegates works from this doc http://vibed.org/api/vibe.http.client/requestHTTP

I see example, but when I am looking on Prototypes I really can't figure how to use them.

For example what does this mean:
 scope void delegate(scope HTTPClientRequest) requester,

it's function that point to method inside class?

No, its a delegate, essentially a fat pointer bundling a function and a context together. It can be a pointer to a class member, e.g. `&myHandler.sendHttpRequest`, but it can also
be a literal using the context of the function:

```
void foo ()
{
  string foo;

scope requester = (scope HTTPClientRequest req) { req.header["foo"] = foo; }

  requestHTTP("http://google.com";, requester);
}
```

By default, `delegate`s are allocated on the heap (GC-allocated).
`scope` delegate means its allocated on the stack (which also means that if you return a `scope delegate`, you'll get random behaviour / segfault because your context points to an invalidated stack frame).


Why I can not call it like:

requestHTTP(url,
        scope req,
        scope res);

I am getting error:

Error: expression expected, not 'scope'
Error: found 'req' when expecting ','
Error: expression expected, not ','
Error: found 'scope' when expecting ','

---

You have two usage of `scope` here. First a `scope delegate` which is used to avoid memory allocation. This `scope delegate` takes parameter: the requester takes a request object (what will be send to the server), and the receiver takes a response object (what has been read from the connection as the response). Those object are marked as `scope`, which means the memory will be destroyed when you exit the `delegate`s. That's also to reduce memory allocation. If you want to save anything (like some headers value), you have to [i]dup it.

Is it's optional parameter?

scope void delegate(scope HTTPClientRequest) requester = cast(void delegate(scope HTTPClientRequest req))null

so I can place instead in just `null`?

Yes. The reason for the various overloads is performance vs convenience. If you provide both requester and receiver, you can process request with a minimal amount of memory allocation. However, if you take the overload that returns an `HTTPClientResponse`, then it will have to allocate it (as well as all the data inside).

Reply via email to