www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Scope variables.

reply "Agustin" <agustin.l.alvarez hotmail.com> writes:
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
Oct 07 2013
parent reply "Agustin" <agustin.l.alvarez hotmail.com> writes:
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.
Oct 07 2013
parent reply "Agustin" <agustin.l.alvarez hotmail.com> writes:
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); }
Oct 07 2013
next sibling parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
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
Oct 07 2013
parent reply "Agustin" <agustin.l.alvarez hotmail.com> writes:
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?
Oct 07 2013
parent reply Justin Whear <justin economicmodeling.com> writes:
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
Oct 07 2013
parent "Agustin" <agustin.l.alvarez hotmail.com> writes:
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!.
Oct 07 2013
prev sibling parent Justin Whear <justin economicmodeling.com> writes:
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.
Oct 07 2013