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

Quirin Schroll qs.il.paperinik at gmail.com
Fri Jun 27 17:15:07 UTC 2025


On Monday, 9 June 2025 at 11:39:15 UTC, Lukanian wrote:
> Why UFCS doesn't work with "with" statement?
>
> ```d
> 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
> }
> ```

The `with` block changes the lookup rule so that unqualified 
symbols (`sum` and `difference` in this case) are looked up in 
the scope of the (type of) the `with` argument first, only then 
normal lookup rules (innermost scope first) apply. What `with(x)` 
doesn’t do is try to resolve any unqualified symbol `s` as `x.s`. 
If it did that, your code would work.

UFCS doesn’t make members and non-members equivalent, it’s just a 
calling syntax that works in *some* cases.


More information about the Digitalmars-d mailing list