#1413 Explicit call to "with" is not a statment

vkuzkokov Tue 15 Feb 2011

So this:

UberService().with(|UberService s| {
   // some code
})

is apparently not a valid statement. And this is why (compiler::CallExpr.isStmt):

// with block applied to stand alone constructor is not valid stmt
if (method.name == "with" && target is CallExpr && ((CallExpr)target).method.isCtor)
  return false

First of all, Sth() { ... } can make perfect sense as a useful statement even if it-block is passed to constructor.

Anyway, I think that explicit call to with shouldn't be any different from any other explicit call.

brian Tue 15 Feb 2011

Any construction of an object not assigned to assigned to a local variable or passed to a parameter isn't considered a statement. Try assigning it to a local variable and it should work.

vkuzkokov Tue 15 Feb 2011

It's not just construction. It's a method call on a newly constructed object (which is allowed both according to docs and current behavior). But

Sth().doWeirdStuff { ... }

is allowed (if we have appropriate method signature) while

Sth().with { ... }

is not.

brian Tue 15 Feb 2011

True it is method call, but we treat that with-block (either explicit or implicit) as part of the construction process. It isn't a perfect rule, but I've found it often is a very good check for catching bugs.

Login or Signup to reply.