in reply to Re: Favorite programming language, other than Perl: in thread Favorite programming language, other than Perl:
I've glanced at Ruby before, probably after someone remarked on how
clean it is. I just took another look this afternoon, and was once
again found myself ready to abandon the attempt without doing anything
useful, for the usual reasons:
- Lack of documentation: If I write a method that takes a block,
how do I then pass that block on to another method? The introductory
guides give examples, but no general rules for how blocks work. After
a bit of searching, I found the Pragmatic Programmers' guide which,
although good, appears to be at least a year out of date. And I still
haven't found the answer, though I'm not done searching. Then again,
maybe I'm just slow or something.
- Hackishness: The syntax is usually clean, friendly, DWIM, and
the like. But when you look at some of the corner cases, it gets
frightening. Take a look at this from the doc:
When Ruby sees a name such as ``a'' in an expression, it needs to
determine if it is a local variable reference or a call to a method
with no parameters. To decide which is the case, Ruby uses a
heuristic. As Ruby reads a source file, it keeps track of symbols
that have been assigned to. It assumes that these symbols are
variables. When it subsequently comes across a symbol that might be
either a variable or a method call, it checks to see if it has seen a
prior assignment to that symbol. If so, it treats the symbol as a
variable; otherwise it treats it as a method call.
So if I add a local variable "foo", it can silently mask subsequent
calls to a function "foo" that I've been happily calling for a month?
Yikes. Sure, Perl has some wierd things going on in places, but they
mostly just show up in golf games.
Don't get me wrong -- it's a fun, interesting language; if you squint
a bit, it's clean at a higher level. But it still seems like a hack,
not a solid foundation for software. I wouldn't trust it with my file
system.
/s
Re: (OT -- ruby) Re: Re: Favorite programming language, other than Perl:
by elusion (Curate) on May 11, 2002 at 02:33 UTC
|
I am one monk who feels strongly about Ruby -- strongly in favor. My main project right now (I'm a teenager -- no job) is in Ruby, so I've gotten to know if fairly well.
As to the lack of documentation. It's true that there's not a lot, but what's out there is good stuff. And the Pragmatic Programmer's guide may be a year old, but it most certainly is not a year out of date. After all, languages don't change that much.
It is possible to receive a block and then pass it on, it's just not introductory guide material. :-) Here's an example
class Foo
def initialize #no initialization needed for this class
end
def bar(&block)
self.baz(&block)
end
def baz
yield(3)
end
end
foo = Foo.new
foo.bar { |n| puts n } # prints "3\n"
When you talk about adding a local variable that masks calls to an earlier added function of the same name, you forget something: Ruby is an object-oriented langauge. You're supposed to call functions on objects, which can't be confused with a variable. In a class definition, you call one of that class's methods like self.method or like method, which is merely a shortcut for the former. It calls that method with that instance from the class.
This was also discussed at Ruby: An Abbot breaks silencewind. If you haven't checked it out, check it out. It's not better or worse than Perl -- it's different, and I love them both. elusion : http://matt.diephouse.com
| [reply] [d/l] [select] |
|
def a
print "Function 'a' called\n"
99
end for i in 1..2
if i == 2
print "a=", a, "\n"
else
a = 1
print "a=", a, "\n"
end
end
Which prints:
a=1
Function 'a' called
a=99
Frankly, I think that's perverse, and object-orientation won't save you. What if, instead of printing, you'd tried to call "a.blah"? Presumably you'd get the same sort of bizarre results.
/s | [reply] [d/l] [select] |
|
Sorry, you missed my point. Maybe some code will help. :-)
class Foo
def a
puts "Function 'a' called"
end
end
foo = Foo.new
(1..2).each do |i|
if i == 2
print "a=", foo.a, "\n"
else
a = 1
print "a=", foo.a, "\n"
end
end
which prints:
Function 'a' called
a=99
Function 'a' called
a=99
You see, functions are meant to belong to a class -- to be methods. Not that you can't declare functions that belong to the main class, but that's not what the design was for. So I guess if you're writing your code in a non-OO way, you could get stuck. But presumably your variable and function names will be better than 'a' :-).
elusion : http://matt.diephouse.com
| [reply] [d/l] [select] |
|
|