A concise description of Ruby?

F

Francis Hwang

That's why Ruby isn't Perl. I can't really tell what you are getting
at
with this point.

This does seem to come up a lot in Python vs. Ruby comparisons. I think
Python people like the idea that the language enforces a lot of ways of
thinking for you: the whitespace issue is part of this. I like Ruby
because you can enter the language whichever way you want: quick
script-hack language, deep OO universe language, somewhere in between.

TIMTOWTDI gets a bad rap 'cause it's so closely associated with Perl.
The problem with Perl isn't that you can do something in more than one
way; the problem is that at a certain scale, the most elegant way to
solve a problem requires you to remember 7 arbitrary lines of
unbelievably arcane syntax. (OO in Perl tends to be a heavyweight
endeavor, for example, whereas most of the Rubyists I know are
constantly extracting new classes without giving it a second thought.)

In short, I'd respond with "Perl gave TIMTOWTDI a bad rap. Ruby is
TIMTOWTDI done right."

F.
 
J

Joao Pedrosa

Hi,
- @vars sux

Used often with a nice syntax color. Can't be beaten by (self) self.
- $vars too

Used for global variables, matches from regular expressions and 10 to
20 "Perl" variables. With a nice syntax color and after getting used
to them, they become handy.
- why should I write 'end'??

Better to use "end" or "}" than to use spaces or tabs. Ruby is much
more maleable because of these. And you can see that in ERuby, ERB or
RHTML. :) (code generation)
- functions should be objects and __call__ is cool (the function
aplication operator, () )

AnyClass() is not as meaninful as AnyClass.new.

This remindes me of capitalization issues. Ruby is clearer:
- methods and variables names start with a lower case character
- classes and modules start with an upper case character.

With Ruby we call the methods directly from the objects, which make ()
kind of irrelevant, and Ruby allows us to not use them.

anObject.method1.method2

This chaining of methods isn't recommended (train wreckage), but they
aren't forbidden as well. Actually, we get addicted to them. It looks
pretty.
- multiple inheritance is a good thing

Mixin is an awesome solution for most problems. It has an ugly name,
but it's an included module. A Ruby module is
module Easy
end
- __nonzero__ is sometimes useful (#to_bool for rubyists )

Not sure about this, but
if anObject
end

is boolean enough most of the time. if anObject is not nil, then the
following block is executed.
- blocks are useless

Wow. They make up for the shortest solutions for many problems.
Closures and blocks are awesome and addicting.
- python's metaclasses are great

Maybe. But Ruby is very extendable. And when it comes to modules,
classes and objects, hard to beat.
- list comprehensions are far better than map() and the likes

Maybe. But closures and maps allow for some neat solutions. List
comprehension is too alien for me.
- hey, writing self is good, you can name it cls or ignore it when non
writing instance methods

Many Python programs may not use OO for the "self" reason. :) OO can
be as complicated and as easy as one wants. With Ruby, OO is piece of
cake.
- having separated concepts for statements and expressions is useful
(just heard once)

Don't know about this.
- callcc is the devil

Never used it. :)
- TIMTOWTDI is a wrong concept

Don't know about this.
- general dislike of %stuff literals

Don't know about this.
- lack of named arguments

Hashes may be used? :)
- docstrings are cool
Cool.

note that not all of them think all this, I just summed all the
different critics.

Thanks for them. It's hard to know exactly from where to start when
comparing the two. But they aren't interchangeable. I can't use Python
with the fluidity that is possible with Ruby.
But I think they just had a quick look at ruby, not a deep one, and they
usually agree that in the end there are far more similarities than
differences.

It's hard to study both languages deep enough to make a fair
comparision. The best comparision may be with examples.

Cheers,
Joao
 
G

gabriele renzi

Nikolai Weibull ha scritto:
And here is what you should respond to their counterexamples:

given than I actually usually give the same answers you did, I'll reply
like they do ;)

notice that:
- I'm running to bed
- where not specified differently you should intend as my pythoneers
friends talking
- you /should/ not answer again or we would replicate any of the usual
threads :D
What can be better than that?
<snip>

self.var , I mean is a var in self , what @ is supposed to mean??
global var

*this* is descouraging!

Because you're telling both Ruby and yourself where something ends?
Sure, Python uses indentation (and thus whitespace) for these things and
we all know what problems people have with indentation and whitespace
(tabs vs. spaces, make, and so on).

we do? a wise pythoneer would not ever use tabs, if he does I won't use
it's code cause it would sux anyway.
And you're going to indent anyway, don't you, so why bother with
specifying writing ends? (my arguments here is to show [1,2,3].map do
.... end.compact )
Anyway tabs will be prohibited in python3k

This is a joke, no? I'll assume it is and will stop here.

(pythoneers do really strange tricks with function objects that we just
would never think of.. I'd like some more syntax sugar for Proc#call
anyway )

Multiple inheritance has its merits, but generally it makes class
hierarchies both harder for the compiler and for the programmer to
understand. Very few objects one may want to model require multiple
inheritance (mostly geometrics). You can do fine without it.

<shows example where he used MI happily, usually related to twisted or
zope iirc, and shows how __mro__ makes it simple to linearize the hierarchy>

Why? In Ruby, everything but false and nil is true, so why would you
want this? If you would want a #to_bool, then use that instead. Using
pseudo-truthvalues on objects is both bad style and confuses the
intention of the code.

he>personal opinion (*I* agree, but there are even rubyists asking for
to_bool from time to time :)

You are surely joking again, no? Blocks are probably the _one single
thing_ that makes Ruby great. Blocks, or closures as they are often
called, are what makes Lisp/Scheme great. They are basically what
defines both Ruby and Lisp/Scheme. If you find them useless you surely
shouldn't be using Ruby.

he> Python has lambda
me> python's lambda sux
he> true, that's why I use functions
me> but why use a function!
he> why not?
me> well, suppose you have

somefunc(func):
func(a)

you'd use a lambda!

he> no, I'd just pass the function object
me> well, but what if you don't have one good function?
he> I write one
me> well, suppose it is as easy as
lambda a: existing(a,2)

he> I'd write it as
somefunc(func, *args)
func(a,*args)
somefunc(existing,2)

me> yes but..
<see old threads on clr and clpy even recently)
Also, if they are useless, why does Python have them?

yeah, they're going to disappear in python 3k, luckily

Why are they better than Ruby's?

they're basically a different concept, if you're talking of singleton
classes. Python's metaclasses allows you to build object hierarchy's
where Klass.class != Class.
(You can do the same in ruby, with different approaches, usually, but
somewhat they seem cool)

- list comprehensions are far better than map() and the likes


Yes, that's why Ruby doesn't have map(); that's why we have .map. Why
do you find that

l = [1, 2, 3]
[i * 2 for i in l]

is far better than

l = [1, 2, 3]
l.map{ |i| i * 2 }

? It's not like one version is longer than the other, or one is easier
to follow than the other? In fact, the Python version requires the use
of two keywords and an additional feature of list creation.

because I can do:
l=[ x**2 for x in list if x >0]

one iteration unifies both filtering and transformation (I really think
we should have something like that in ruby :/ )
Oh, and nowadays we have generator expressions, so we can even have lazy
generators done this way, while in ruby you have stuff like zip that
would end up as a memory hog (here you show generator.rb, but call/cc
performance is bad)

And I can write quicksort in three lines (splitted cause I don't
understand how thunderbird works)

def qs(L):
if len(L) <= 1: return L
return qs([lt for lt in L[1:] if lt < L[0]]) + \
[ L[0] ] + qs( [ ge for ge in L[1:] if ge >= L[0] ] )


(my best effort is 6 line, but more readable :)
How is that a good thing? If you want to ignore it, then wouldn't you
rather simply not mention it at all?

In static methods you ignore self.
In class and metaclass methods you use cls.
If you had given a decent argument
for this, such as "I use it as a reminder that obj.method(...) is more or
less like writing method(obj, ...) as : is in Lua", then at least you
would have made an argument for your point.

Of course you argument also holds, and relates to the tricks we can do
in python, such as
foo=module.module.object.foo
foo(a) #equals to object.foo(a), but saves 3 lookups

What do you mean? That everything shouldn't have a value? If so, why?
I admit that it's not always useful, but there certainly are times that
one appreciates this and there's no reason it shouldn't be this way. It
only simplifies the concepts, both for the programmer, the language
designer, and the compiler. Writing a denotational semantics for the
language.

( can't remember sorry :/)

Yes, certainly, and look how easy it is to simulate in Python:

http://www.ps.uni-sb.de/~duchier/python/continuations.html

good reason to not have it in the language
You obviously don't understand what you're talking about. You just
followed some of the threads about continuations and thought to yourself,
"Boy, I'm certainly not following this discussion. I'll just say that I
think that call/cc is evil and people will think that I've thought this
through and that I am somehow gifted."

I think this cause We had continuations in stackless python and we
removed 'em cause tasklets are better, simpler and does not reinvent
wheels.
That's why Ruby isn't Perl. I can't really tell what you are getting at
with this point.

having:
%{foo}
%.foo.
%q{foo}
%Q{foo}
%q miao
"foo"
'goo'

is useless timtoetidy

You mean like %{literal}? Don't use them then.

don't using is not a chance, I may encounter code written by others
using it.
Is it better to have '''literal''', """literal""", r"literal",
u"literal", ur"literal", U"literal", UR"literal", Ur"literal", and
uR"literal". Yeah, that's certainly _a lot_ better.

it's just u and r and this is just a case.
timotoetidy is everywhere in ruby, just think of ho many ways you can
read lines from a file in ruby.
While it is true that Ruby doesn't have named arguments as such atm (you
may use hashes instead), there is a nice syntax in the works for later
versions.

see? you just copy!

Yes, they are. Finally, an argument that actually stands up against
simple critique. Ironic that it should be your last choice ;-).

me> deheheh :)
Hopefully not too many similarities ;-),
nikolai

I actually hope for more, like having blocks and implicit things in
python :D
 
F

Florian Gross

Nikolai Weibull wrote:

I'm a passionate Ruby user myself and I find Python quite limiting in
some aspects (I agree with Francis Hwang's response to your posting),
but as a Ruby user I still have to disagree with / add to some of the
responses you give.
This is a joke, no? I'll assume it is and will stop here.

It isn't and it can make for quite some elegant code if you can call
functions directly, though this doesn't fit at all into the Ruby model.
(Because we have no public fields and use accessors that look like field
access all over the place.)

The elegance of having a () operator IMHO is that you can do things like
this directly:

[1, 2, 3].each(output)

Where output can either be a built-in method (or a variable referring to
one) or a custom one. (Lambda in Ruby.)

It's also interesting how this lets you assign functions to fields and
get methods automatically:

var obj = [1, 2, 3]
obj.each = function(block) {
this.reverse().each(block)
}

This model has downsides of course, a big one being that you can't have
accessors (I think properties are commonly used, which is just a set of
callbacks for assignment/accessing a field.) and the other one being
that you want to omit parentheses. Python solves the latter one by
making core functions like print no real functions, but rather a piece
of built-in syntax.

I have to say that I prefer Ruby's model here, though I can see some of
the elegance of the other one, too.
Multiple inheritance has its merits, but generally it makes class
hierarchies both harder for the compiler and for the programmer to
understand. Very few objects one may want to model require multiple
inheritance (mostly geometrics). You can do fine without it.

I think Mix-Ins are generally seen as a more limited (and thus easier to
understand and maintain) form of Multiple Inheritance. I personally have
not needed more than what Mix-Ins provide yet, but Evil Ruby has support
for Multiple Inheritance via Module#inherit in case anybody wants to try
this out in practice. (It works by converting the given class to a
Module and calling include() with it as the argument.)
Why? In Ruby, everything but false and nil is true, so why would you
want this? If you would want a #to_bool, then use that instead. Using
pseudo-truthvalues on objects is both bad style and confuses the
intention of the code.

Because you might want to have Objects that act like other Objects.

In current Ruby there is no way of having a WeakRef or some other kind
of Proxy act like nil or false. This is a limitation.

I would also find this useful for implementing Perl6-style Junctions,
but that might not be a big point.
Also, if they are useless, why does Python have them?

Python has blocks? As far as I know it only has some crippled form of
lambdas that are only allowed to have one statement inside. The
non-crippled form are nested defs, but those don't have closures by
default. (There is a way of emulating closures via default arguments,
but it is quite cumbersome.)
- list comprehensions are far better than map() and the likes

Yes, that's why Ruby doesn't have map(); that's why we have .map. Why
do you find that

l = [1, 2, 3]
[i * 2 for i in l]

is far better than

l = [1, 2, 3]
l.map{ |i| i * 2 }

? It's not like one version is longer than the other, or one is easier
to follow than the other? In fact, the Python version requires the use
of two keywords and an additional feature of list creation.

There is one benefit of list comprehensions that I can think of right
now -- they don't need to construct immediate lists which makes them act
like Shell pipes.

I can think of various ways to emulate this in Ruby, but still -- it is
simpler to do it in Python.

Other than that I think that Ruby's list iteration capabilities feel
generally more powerful. Being able to directly use blocks instead of
using a nested def with some odd default argument hack contributes a lot
of it, but the bigger point is that Ruby has a lot of this already
built-in via the Enumerable module.
Yes, certainly, and look how easy it is to simulate in Python:

http://www.ps.uni-sb.de/~duchier/python/continuations.html

But note that this is just a way of emulating them. This won't give you
the power you have with built-in continuations.

I'm not sure if you're really implying here that Continuations are evil,
but they can certainly be useful in more esoteric contexts. (Note that
Continuations allowed me to implement Binding.of_caller in pure Ruby
with a quite reasonable interface.)
That's why Ruby isn't Perl. I can't really tell what you are getting at
with this point.

I disagree with both these opinions. Python's view is that there is only
one truly right way of doing things. But of course this isn't true and
not even consistently applied in Python -- requirements vary all the
time and solutions to problems ought to vary with them.
Yes, they are. Finally, an argument that actually stands up against
simple critique. Ironic that it should be your last choice ;-).

Also note that we are getting close with RDoc. What is currently missing
is a nice way of accessing RDoc documentation from irb. I would like to
see support for that included in a further irb version.

Regards,
Florian Gross
 
G

gabriele renzi

Joao Pedrosa ha scritto:
This remindes me of capitalization issues. Ruby is clearer:
- methods and variables names start with a lower case character
- classes and modules start with an upper case character.

just a note on this:
we have Kernel.Float(astring) (and Integer and others).
Yeah, they are ugly imo.



Thanks for them. It's hard to know exactly from where to start when
comparing the two. But they aren't interchangeable. I can't use Python
with the fluidity that is possible with Ruby.

me neither, and I really feel that I'd choose ruby everyday of my life :)
It's hard to study both languages deep enough to make a fair
comparision. The best comparision may be with examples.

Actually, I just replied to point out that the pleac project at
http://pleac.sf.net is an effort to reproduce the perl cookbook examples
in many languages.

Quite expected, python and ruby are the most complete efforts as of now.

Less expected, our 61,57% of completion just got over python's 61.14%,
prepare the party for when we reach 100% :D
 
F

Florian Gross

gabriele said:
Nikolai Weibull ha scritto:
* gabriele renzi <[email protected]> [Oct 21, 2004 00:40]:
self.var , I mean is a var in self , what @ is supposed to mean??
global var

*this* is descouraging!

@ is used in rogue likes (like NetHack) to represent your*self*. Not
sure if this is why matz choose that symbol, but it sure makes sense. :)
(pythoneers do really strange tricks with function objects that we just
would never think of.. I'd like some more syntax sugar for Proc#call
anyway )

Any samples? Sounds interesting.
<shows example where he used MI happily, usually related to twisted or
zope iirc, and shows how __mro__ makes it simple to linearize the
hierarchy>
__mro__?

they're basically a different concept, if you're talking of singleton
classes. Python's metaclasses allows you to build object hierarchy's
where Klass.class != Class.
(You can do the same in ruby, with different approaches, usually, but
somewhat they seem cool)

Is this used for anything else than starting with a BlankSlate?
one iteration unifies both filtering and transformation (I really think
we should have something like that in ruby :/ )
Oh, and nowadays we have generator expressions, so we can even have lazy
generators done this way, while in ruby you have stuff like zip that
would end up as a memory hog (here you show generator.rb, but call/cc
performance is bad)

Also note that Enumerable#zip can take a block. In that case it doesn't
create the intermediate Array.

I'm also pretty sure that we can do these chains without using
Continuations.

Maybe with nested blocks like this:

class FilteredEnumerable
def initialize(enumerable, &filter)
@enumerable, @filter = enumerable, filter
end

def each(&block)
@enumerable.each do |item|
block.call(item) if @filter.call(item)
end
end
end

module Enumerable
def filter(&block)
FilteredEnumerable.new(self, &block)
end
end

languages = %w{ruby perl python lisp smalltalk}

languages.filter do |language|
language.size != 6
end.each do |language|
p language
end

But I think in that example I would use this anyway:

languages.filter do |language|
next if language.size == 6

p language
end

Maybe the above technique works better for more complex cases.

Regards,
Florian Gross
 
Y

Yukihiro Matsumoto

Hi,

In message "Re: Python vs. Ruby (Re: A concise description of Ruby?)"

|@ is used in rogue likes (like NetHack) to represent your*self*. Not
|sure if this is why matz choose that symbol, but it sure makes sense. :)

I think inspiration came somewhere around rogue actually. I used to
play rogue a lot. Now I read "@foo" as "ATtribute foo", which also
makes sense for me.

matz.
 
G

Gavin Kistner

Yes, JavaScript is underrated. A lot of the things we do with Ruby can
be
done with JavaScript (its just not as clean).
Agreed.

In fact, it was because of JavaScript that I found Ruby.

Same ... I really enjoyed doing web development in JS (client-side and
server-side via JS ASP), but I was tired of relying on IIS. I went
hunting for a new programming language that had strong OOP, dynamic
interpretation, and was open-source and multi-platform. I spent 3 weeks
evaluating SmallTalk, Python, and Ruby (in that order). I almost went
with Python when I found Zope. Then I got to Ruby.

Wow. It has surpassed my expectations and desires so very, very fully.
Yum.
 
J

James Britt

This Rubyist taught a class in JavaScript, and tried to teach how to
write JavaScript in a cleaner, OO way that typically doesn't appear in
most books, Web tutorials, or examples.

And a good deal of the thinking came from experience with Ruby.

(And when some class members asked about learning another , more
general-purpose, programing language, I of course suggested Ruby ...)
 
J

James Britt

trans. (T. Onoma) said:
| > "JavaScript: It's sweeter than you think."
|
| Yes, JavaScript is underrated. A lot of the things we do with Ruby can be
| done with JavaScript (its just not as clean).

And the DOM sucks.

DOM? There is no DOM in JavaScript. There are JavaScript bindings for
the W3C XML/HTML DOM. Yeah, those things could be better. But don't
blame JavaScript for that.

James
 
J

James Britt

BTW, a discussion of this sort of JavaScript goodness came up at the
recent EuRuKo conference, as part of the general topic of how to teach
programming.

For more JS fun, see
http://w3future.com/html/beyondJS/
http://w3future.com/html/stories/hop.xml


James

(Be warned: the site foolishly overrides the default browser keyboard
commands, so if you use the keyboard (as I do) to move around the
browser (e.g., ALT-D to get to the address bar) you may find yourself
changing pages.)
 
J

James Britt

bruno said:
James Britt a écrit :
(snip)
Although the phrase has been glommed by Python fans, I believe it more
appropriate to say that Ruby is almost like executable pseudo-code[*].
There is very little extraneous syntax to interfere with simply
expressing what you want to do.
(snip)

[*] Show of hands: How many people write "__self__" as a routine part
of of their pseudo code?

Err... actually, it's 'self', not '__self__', and since it's pretty
common in OOPLs to have a 'self', 'this' or like keyword to refer to the
current instance in methods, I don't see where's the problem. Now, how
many people would write @attr instead of this.attr or self.attr in their
pseudocode ?-)


Oh, quite right, but that's why I would say that Ruby is *almost* like
pseudo code.

My pseudo code tends to look like

foo() {
...
}

No self, no def.


James
 
N

Nikolai Weibull

But note that this is just a way of emulating them. This won't give you
the power you have with built-in continuations.
I'm not sure if you're really implying here that Continuations are evil,
but they can certainly be useful in more esoteric contexts. (Note that
Continuations allowed me to implement Binding.of_caller in pure Ruby
with a quite reasonable interface.)

No, I'm not implying that continuations are evil, I think they are a
great way to model many things.
nikolai
 
G

gabriele renzi

Florian Gross ha scritto:

disclaimer: I think all this things can be done in ruby via different
approaches, just trying to show the one in the P-language :)
Any samples? Sounds interesting.

well, the only things I recall ATM are:

foo= module.module.object.foo

people.sort(key=person.get_id)

the descriptors tricks such as
c.meth = function.__get__(c)
staticmethod/classmethod

and the strange things that can be done with function attributes (think
of __doc__, just to name one). I'm not a good enough pythoneer (nor
rubyist, FTM ) to really understand all of this :)




the attribute that specifies how to search in ancestors for an attribute
(Method Resolution Order, oh, the love for acronyms ;).
There is a paper about the default behaviour:
http://www.sourcekeg.co.uk/www.python.org/2.3/mro.html
but you can ovverride it by yourself if you fell that it is useful
Is this used for anything else than starting with a BlankSlate?

well, it seem so :)
For example, you can build singleton classes with
class A(object):
__metaclass__=SingletonMeta

or you can build a class hierarchy where you can't modify objects'
attributes, or define an Interface metaclass whose' instances are
interfaces that behave in a java-like fashion.
The gnosis.magic package has a lot of cool metaclass usages.

In ruby we mostly do this via mixins.
I can't tell you if there are things doable with oneapproach that are
not possible with the other, but I guess no.
Pythoneers use to say that everything doable with metaclasses was
possible withouth them, but now it is more simple.

Also note that Enumerable#zip can take a block. In that case it doesn't
create the intermediate Array.

is this really done inline? I got the feeling it would build the array
anyway. Nice to hear the I'm wrong :)
I'm also pretty sure that we can do these chains without using
Continuations.

sure, and in fact I advocate having someting like that builtin.
I talked about the callcc thing just to handle lazy sequences in the
general case.
 
G

gabriele renzi

Florian Gross ha scritto:

It isn't and it can make for quite some elegant code if you can call
functions directly, though this doesn't fit at all into the Ruby model.
(Because we have no public fields and use accessors that look like field
access all over the place.)

I think the problem lies in having overlap beetween methods and
variables, no in the lack of public fields.
If I were going to write my own language I'd state that:
- object and methods share the same namespace
- 'foo' returns object
- 'foo stuff' is a method call, if foo is_a callable it got called
- 'foo()' forces call
- 'object.foo' is a method call

(yeah, if you have @foo and object.foo you could write object.foo()()..
but hey, that would be /my/ language :p )

Anyway this would break ruby in case like
eval(foo,binding) anyway , cause we have a possible overlap beetween a
local var and a method, now..
 
C

Curt Hibbs

James Britt [mailto:[email protected]]
This Rubyist taught a class in JavaScript, and tried to teach how to
write JavaScript in a cleaner, OO way that typically doesn't appear in
most books, Web tutorials, or examples.

And a good deal of the thinking came from experience with Ruby.

It's interesting that my path was analogous, but reversed. Seven years ago I
wrote the equivalent of ActiveRecord in JavaScript -- using the database
schema to automatically construct auto-updating objects with attributes
named after the table's columns.

I think this positive experience with dynamic programming made it easier for
me to immediately understand the benefits of ruby (I guess being an
ex-smalltalker who understood blocks didn't hurt either :).

Curt
 
K

Karl von Laudermann

Curt Hibbs said:
So, I wanted to ask all of you, what would your answer be to the question
"What is Ruby"?

My standard answer is "It's the third item in the set 'Perl, Python, and Ruby'".
 
G

Gavin Sinclair

My standard answer is "It's the third item in the set 'Perl, Python, and Ruby'".

Nice. Like: what _is_ the number three? A: the size of a set with
three members.

Gavin
 
A

Aredridel

So, I wanted to ask all of you, what would your answer be to the question
"What is Ruby"?

I say "A language that's like the best parts of Smalltalk, Perl and
Lisp, all in one, and no line noise, parentheses or weird VM"

--Ari
 
J

Josef 'Jupp' Schugt

Curt said:
Yesterday, a co-worker came into my office and saw the shiny, new
pickaxe II book on my desk and said "What is Ruby?"

Unfortunately, I really blew the opportunity as I attempted to come
up with a brilliant one or two sentence description. The best I could
muster was something like, "Uhh... err... it's kind of like perl or
python but much better." How lame is that!

I think it makes little sense to address the question "What is Ruby?"
but rather to answer the truely intended one: "Is there any good reason
to switch to Ruby?". I am confident that your co-worker had the latter
question in mind but simply didn't find the right words.

Do not expect me to give a one-and-for-all objective answer. If you want
to actually convice someone of the advantages of something your private
and subjective answers are what matter. Why?

You surely know that these answers actually made somebody (you) use
Ruby. They also are the reason why you think that others should follow
the same path.

I cannot speak for you or for anybody else using Ruby but I can answer
the question why *I* use Ruby. It

- is easy and fun to learn and use

- strongly encourages structured, expressive and readable code

- makes object-orientation a natural approach of solving problems

- replaces fighting against shortcomings of the language by solving the
problem at hand

- is highly addictive: once you tried it you cannot imagine life without

The last point is important to me: In the old days I started with Basic.
Then came Turbo Pascal, a small COBOL intermezzo, some machine language,
C, C++, Perl, Kornshell, some Java and finally C#.

While none of the languages made me feel at home, C# at least made me
feel welcome. Then I met Ruby and immediately was sure that this was
love at first sight, that this was the one to share life with.

One language I didn't mention so far is Python. People had told me that
they loved Python and what they said about it sounded promising. So I
dated with Python. She was cute and very smart - it is not surprising to
me that she has so many admirers. Nevertheless it turned out that we are
much to different to become a couple.

Don't think that I have gone made because I talk about 'loving' a
programming language. If you have a choice you will share your time with
people you love or at least like, not with people about which others say
one should share one's time with. Why should one then want to share
one's time with a programming language one doesn't really like? Just
because people say that it is cool to do so?

Josef 'Jupp' Schugt
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top