if(/[a-z]*/.matches("ab")) {
println(it.matchLength()); }
instead of
var x = /[a-z]*/.matches("ab");
if(x != null) { println(x.matchLength()); }
Personally, I tend to agree with Ola regarding the virtue of this mechanism.
The comments made by readers show how subjective - not to say: biased - the whole issue of "syntactic elegance" is. As of Tuesday evening (GMT), here is a short summary of the various opinions.
Marcelo prefers a Smalltalk-like style:
/[a-z]*/.ifMatches("ab", res,
{ println(res.matchLength()); },
{ println("no match"); })
Stefano wants the variable declaration to be explicit:
if(x = /[a-z]*/.matches("ab")) {
println(x.matchLength()); }
Paul advocates the introduction of "=>" as a pattern matching operator:
/[a-z]*/ => x
Antares Trader argues for a closure with a parameter:
if(/[a-z]*/.matches("ab")) { |x|
println(x.matchLength()); }
Johannes says that Option types neatly express the idiom in question.
I think that local optimizations of the syntax (in contrast to global aspects such as: typing discipline, programming paradigm, object model, standard library) are largely a waste of time. Will programmers not use the language because they cannot change the name of the "it" variable? Even fifty (local) improvements to the syntax, will not make a difference. The exact notation chosen for this construct will have nearly no impact on Ioke's future success.
Therefore, my rule of thumb is this: It is worth while to debate over a local syntactic issue only if you have knock-out argument. If you are only going to win by points, don't bother.
We can debate about winning by points, but I'd like to make one. :)
Ruby has an 'it.' We just name it '$~'. The difficulty it that $~ or it or whatever else change as soon as any other match is done. I advocated for a closure because once in the closure the assigned variable will never be reset by a second match.
Anonymous
January 13, 2009 at 5:19 AM