Kevin Olemoh
10/17/2006 6:10:00 PM
Its probably best to have a strict option like in perl and VB.net. If
I am understanding what Daniel is saying properly and ruby works in
such a way that what should be a typo that generates an error is
accepted by ruby as a legit variable in spite of the fact that the
programmer really meant to say count it creates a set of situations
that are very error prone and that is not a good thing.
On 10/16/06, Daniel Martin <martin@snowplow.org> wrote:
> "Gavin Kistner" <gavin.kistner@anark.com> writes:
>
> > The original post in this thread suggests that omitting declarations of
> > variables leads to debugging problems for no real gain. My intended
> > point was that (for me) a lot of Ruby's elegance comes from its
> > simplicity of expression. Ruby doesn't do anything that I can't do in
> > Lua or JavaScript, except make my life as a programmer way easier.
>
> I think what the OP was getting at is that assignment syntax is
> identical to declaration syntax, and there's no clear distinction
> between the two. Therefore, when you want an assignment to be an
> assignment of an already declared variable, you have nothing checking
> you for typos.
>
> This has nothing to do, by the way, with variable typing. As an
> example, perl with the "strict" flag on behaves this way, requiring
> variables to be declared before use and most perl programmers don't
> find the extra checking cumbersome (in fact, if you go to perlmonks,
> the first thing they'll ask you to do is to turn on "use strict").
> Although variables can be declared in outher ways (it is, after all,
> perl) most perl programmers just put "my " in front of their first
> usage of a variable, and that's that. You can declare and assign in
> one statement, or do them in two.
>
> In ruby, I imagine that we'd evolve some syntax like this:
>
> class Foo
> def initialize(name, thing)
> n @name = name
> n @thing = thing
> n @count = 0
> end
>
> def inc
> # This line is an error at class definition parse time, because
> # I typoed a variable name
> @coutn += 1
> end
>
> def compute
> # these four will be initialized to nil
> n a,b,c,d
> # I can now use a, b, c, and d as local variables without further
> # declaration.
> end
> end
>
> Note that separating declaration from assignment also makes it dirt
> simple to decide the proper scope of a variable, instead of having to
> have the switch between ruby 1.9 and ruby 2.0 of various scoping
> details.
>
> I'd welcome such a syntax to ruby - requiring, of course, a per-file
> strictness switch; no point in killing backwards compatibility - and I
> think that the extra typing would provide sufficient benefit to be
> worth it. Note that block parameters are already declared in the ||
> list at the start of the block, so nothing changes in:
> myArray.each {|a,b| alert(a,b)}
> although I may want to think carefully about what that block means in
> the presence of a declared variable called 'b' in the surrounding
> scope. I generally wouldn't want the variable capture ruby does
> presently, but some might.
>
> --
> s=%q( Daniel Martin -- martin@snowplow.org
> puts "s=%q(#{s})",s.map{|i|i}[1] )
> puts "s=%q(#{s})",s.map{|i|i}[1]
>
>