Thread overview
Scope variables.
Oct 07, 2013
Agustin
Oct 07, 2013
Agustin
Oct 07, 2013
Agustin
Oct 07, 2013
Ali Çehreli
Oct 07, 2013
Agustin
Oct 07, 2013
Justin Whear
Oct 07, 2013
Agustin
Oct 07, 2013
Justin Whear
October 07, 2013
I'm having a hard time trying to use "scoped".

public T callEvent(T, A...)(auto ref A args) const
{
  T pEvent = scoped!T(forward!args);
  postEvent(pEvent, typeid(T).toHash);
  return pEvent;
}

private void postEvent(ref Event event, Event.ID type) const
{
  ....
}

src\event\EventManager.d(37): Error: function ghrum.event.EventManager.EventManager.postEvent (ref Event event, uint type) const is not callable using argument types (MyEvent,uint)
src\event\EventManager.d(37): Error: function ghrum.event.EventManager.EventManager.postEvent (ref Event event, uint type) const is not callable using argument types (MyEvent,uint) const
src\event\EventManager.d(37): Error: cast(Event)pEvent is not an lvalue
October 07, 2013
On Monday, 7 October 2013 at 19:58:21 UTC, Agustin wrote:
> I'm having a hard time trying to use "scoped".
>
> public T callEvent(T, A...)(auto ref A args) const
> {
>   T pEvent = scoped!T(forward!args);
>   postEvent(pEvent, typeid(T).toHash);
>   return pEvent;
> }
>
> private void postEvent(ref Event event, Event.ID type) const
> {
>   ....
> }
>
> src\event\EventManager.d(37): Error: function ghrum.event.EventManager.EventManager.postEvent (ref Event event, uint type) const is not callable using argument types (MyEvent,uint)
> src\event\EventManager.d(37): Error: function ghrum.event.EventManager.EventManager.postEvent (ref Event event, uint type) const is not callable using argument types (MyEvent,uint) const
> src\event\EventManager.d(37): Error: cast(Event)pEvent is not an lvalue


callEvent!MyEvent(); Being MyEvent a subclass of Event.
October 07, 2013
On Monday, 7 October 2013 at 19:59:09 UTC, Agustin wrote:
> On Monday, 7 October 2013 at 19:58:21 UTC, Agustin wrote:
>> I'm having a hard time trying to use "scoped".
>>
>> public T callEvent(T, A...)(auto ref A args) const
>> {
>>  T pEvent = scoped!T(forward!args);
>>  postEvent(pEvent, typeid(T).toHash);
>>  return pEvent;
>> }
>>
>> private void postEvent(ref Event event, Event.ID type) const
>> {
>>  ....
>> }
>>
>> src\event\EventManager.d(37): Error: function ghrum.event.EventManager.EventManager.postEvent (ref Event event, uint type) const is not callable using argument types (MyEvent,uint)
>> src\event\EventManager.d(37): Error: function ghrum.event.EventManager.EventManager.postEvent (ref Event event, uint type) const is not callable using argument types (MyEvent,uint) const
>> src\event\EventManager.d(37): Error: cast(Event)pEvent is not an lvalue
>
>
> callEvent!MyEvent(); Being MyEvent a subclass of Event.

So i found out that i cannot do this, may i ask why?

public class A
{
  int x = 0;
}

public class B : A
{
}

void func(ref A a)
{
}

void main()
{
  B b = new B();
  func(b);
}
October 07, 2013
On 10/07/2013 03:52 PM, Agustin wrote:
> On Monday, 7 October 2013 at 19:59:09 UTC, Agustin wrote:
>> On Monday, 7 October 2013 at 19:58:21 UTC, Agustin wrote:
>>> I'm having a hard time trying to use "scoped".
>>>
>>> public T callEvent(T, A...)(auto ref A args) const
>>> {
>>>  T pEvent = scoped!T(forward!args);
>>>  postEvent(pEvent, typeid(T).toHash);
>>>  return pEvent;
>>> }
>>>
>>> private void postEvent(ref Event event, Event.ID type) const
>>> {
>>>  ....
>>> }
>>>
>>> src\event\EventManager.d(37): Error: function
>>> ghrum.event.EventManager.EventManager.postEvent (ref Event event,
>>> uint type) const is not callable using argument types (MyEvent,uint)
>>> src\event\EventManager.d(37): Error: function
>>> ghrum.event.EventManager.EventManager.postEvent (ref Event event,
>>> uint type) const is not callable using argument types (MyEvent,uint)
>>> const
>>> src\event\EventManager.d(37): Error: cast(Event)pEvent is not an lvalue
>>
>>
>> callEvent!MyEvent(); Being MyEvent a subclass of Event.
>
> So i found out that i cannot do this, may i ask why?
>
> public class A
> {
>    int x = 0;
> }
>
> public class B : A
> {
> }
>
> void func(ref A a)
> {
> }
>
> void main()
> {
>    B b = new B();
>    func(b);
> }

Since classes are already references, you would normally pass A, not 'ref A'.

If you really want to pass 'ref A', perhaps you want to change the actual object that an A is referring to:

public class C : A
{}

void func(ref A a)
{
    a = new C;    // <-- A reason for taking 'ref A'
}

However, that would upset the caller, which thinks it has a reference to a B object:

void main()
{
  B b = new B();
  func(b);        // <-- Oops! Not a B anymore?
}

Ali

October 07, 2013
On Tue, 08 Oct 2013 00:52:19 +0200, Agustin wrote:
> 
> So i found out that i cannot do this, may i ask why?
> 
> public class A {
>    int x = 0;
> }
> 
> public class B : A {
> }
> 
> void func(ref A a)
> {
> }
> 
> void main()
> {
>    B b = new B();
>    func(b);
> }

Get rid of the "ref" in func's signature--objects are already by reference.  With that fix, compiles just fine for me.
October 07, 2013
On Monday, 7 October 2013 at 22:57:17 UTC, Ali Çehreli wrote:
> On 10/07/2013 03:52 PM, Agustin wrote:
>> On Monday, 7 October 2013 at 19:59:09 UTC, Agustin wrote:
>>> On Monday, 7 October 2013 at 19:58:21 UTC, Agustin wrote:
>>>> I'm having a hard time trying to use "scoped".
>>>>
>>>> public T callEvent(T, A...)(auto ref A args) const
>>>> {
>>>> T pEvent = scoped!T(forward!args);
>>>> postEvent(pEvent, typeid(T).toHash);
>>>> return pEvent;
>>>> }
>>>>
>>>> private void postEvent(ref Event event, Event.ID type) const
>>>> {
>>>> ....
>>>> }
>>>>
>>>> src\event\EventManager.d(37): Error: function
>>>> ghrum.event.EventManager.EventManager.postEvent (ref Event event,
>>>> uint type) const is not callable using argument types (MyEvent,uint)
>>>> src\event\EventManager.d(37): Error: function
>>>> ghrum.event.EventManager.EventManager.postEvent (ref Event event,
>>>> uint type) const is not callable using argument types (MyEvent,uint)
>>>> const
>>>> src\event\EventManager.d(37): Error: cast(Event)pEvent is not an lvalue
>>>
>>>
>>> callEvent!MyEvent(); Being MyEvent a subclass of Event.
>>
>> So i found out that i cannot do this, may i ask why?
>>
>> public class A
>> {
>>   int x = 0;
>> }
>>
>> public class B : A
>> {
>> }
>>
>> void func(ref A a)
>> {
>> }
>>
>> void main()
>> {
>>   B b = new B();
>>   func(b);
>> }
>
> Since classes are already references, you would normally pass A, not 'ref A'.
>
> If you really want to pass 'ref A', perhaps you want to change the actual object that an A is referring to:
>
> public class C : A
> {}
>
> void func(ref A a)
> {
>     a = new C;    // <-- A reason for taking 'ref A'
> }
>
> However, that would upset the caller, which thinks it has a reference to a B object:
>
> void main()
> {
>   B b = new B();
>   func(b);        // <-- Oops! Not a B anymore?
> }
>
> Ali

Doesn't ref means i'm passing the parameter by reference instead of by value?. Isn't "a" being copied when calling func?, or does D always pass by reference when using classes and structures?
October 07, 2013
On Tue, 08 Oct 2013 01:01:43 +0200, Agustin wrote:
> Doesn't ref means i'm passing the parameter by reference instead of by value?. Isn't "a" being copied when calling func?, or does D always pass by reference when using classes and structures?

Class instances are by reference already, structs are by value.  For further comparison, please see the table here: http://dlang.org/struct.html
October 07, 2013
On Monday, 7 October 2013 at 23:18:13 UTC, Justin Whear wrote:
> On Tue, 08 Oct 2013 01:01:43 +0200, Agustin wrote:
>> Doesn't ref means i'm passing the parameter by reference instead of by
>> value?. Isn't "a" being copied when calling func?, or does D always pass
>> by reference when using classes and structures?
>
> Class instances are by reference already, structs are by value.
>  For
> further comparison, please see the table here:
> http://dlang.org/struct.html

Thank you!.