June 09

Why UFCS doesn't work with "with" statement?

struct MyStruct1
{
  int a, b;
  int sum(){
    return a+b;
  }
}

int difference(ref MyStruct1 self)
{
  return self.a-self.b;

}

// in main()

MyStruct1 s = { 1, 2 };

s.difference().writeln; // works fine

with(s){
  sum().writeln;
  difference().writeln; // error: too few arguments, expected 1, got 0
}
June 09

On Monday, 9 June 2025 at 11:39:15 UTC, Lukanian wrote:

>

Why UFCS doesn't work with "with" statement?

struct MyStruct1
{
  int a, b;
  int sum(){
    return a+b;
  }
}

int difference(ref MyStruct1 self)
{
  return self.a-self.b;

}

// in main()

MyStruct1 s = { 1, 2 };

s.difference().writeln; // works fine

with(s){
  sum().writeln;
  difference().writeln; // error: too few arguments, expected 1, got 0
}

It took me a while what you were trying to do, but I think I get it now. I'm not an expert on D, but from what I understand, the reason why it doesn't work is because the difference function is not a method of the struct. The "with" keyword works what's a member of the argument. So essentially yeah, you're calling difference without any argument.