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] > >