Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

(OT -- ruby) Re: Re: Favorite programming language, other than Perl:

by educated_foo (Vicar)
on May 11, 2002 at 01:57 UTC ( #165830=note: print w/replies, xml ) Need Help??

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.


  • Comment on (OT -- ruby) Re: Re: Favorite programming language, other than Perl:

Replies are listed 'Best First'.
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 = { |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 :

      Re passing blocks: thanks. Got that part working.

      But about the other, I probably need to clarify a bit. The example in the doc was the following:

      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.


        Sorry, you missed my point. Maybe some code will help. :-)
        class Foo def a puts "Function 'a' called" end end foo = (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 :

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://165830]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (1)
As of 2021-07-24 02:48 GMT
Find Nodes?
    Voting Booth?

    No recent polls found