On Sun, 27 Feb 2005, Greg T wrote:
> I am a Rubyist, but I've decided to learn Python so that when a > conversation springs up about the merits of the two languages amd how > they compare, I will be well informed. Hi Greg, Welcome aboard! That sounds great; you can help us understand Ruby better when we have questions. *grin* > So far, some things I dont care for and have me scratching my head: Ok, we'll try addressing some of your head-scratching questions: > immutable strings Immutable strings aren't unique to Python: technically, string literals in C are also supposed to be immutable (that's why GCC supports the '-fno-const-strings' flag!) , and they're also immutable in Java. The other thing is that Python follows a model where values are objects, and variable names are just references to values. So when we do something like: ### >>> message = "hello world" >>> anotherMsg = message ### Both 'message' and 'anotherMsg' both refer to a single string value. We can see this using the id() function: ### >>> id(message) 3607272 >>> id(anotherMsg) 3607272 ### So there isn't any string copying going on here. We can simulate mutable strings by turning a string into a list: ### >>> myBuffer = list("hello world") >>> myBuffer[1] = 'a' >>> msg = ''.join(myBuffer) >>> msg 'hallo world' ### > no case statement If you're doing a case analysis based on a single value, then a dispatch table may be able to do what you want. You may find: http://mail.python.org/pipermail/tutor/2004-December/033728.html helpful. > lack of internal iterators I'm not quite sure what you mean by "internal iterators". There is an iterator protocol that objects can support: http://www.python.org/doc/lib/typeiter.html where lists, files, and strings conform to the protocol and can be iterated across with a 'for' loop. > Question(s): > > Are there any good books/documents that actually examine the ruby way vs > python way? (by someone that knows both languages) I haven't seen one yet; if you find one, let us know. I'm actually quite interested in Ruby, since a friend of mine is writing Ruby code that I'll probably have to maintain soon. *grin* > The other day I saw a post from a gentleman trying to do a basic prompt > and add type of calculator. He wanted to assign the +, or * operator to > a variable to use, but I believe he was told you have to use the literal > +, or *. The 'infix' operators aren't first-class in Python. That being said, there are first-class function equivalents in the 'operator' module: http://www.python.org/doc/lib/module-operator.html and these are first class, so it's possible to writing something like this: ### >>> import operator >>> sumOfNumbersUpToTen = reduce(operator.add, range(1, 11)) >>> factorialTen = reduce(operator.mul, range(1, 11)) >>> sumOfNumbersUpToTen 55 >>> factorialTen 3628800 ### > In ruby, you can rerence the * operator > operator = :* > num1 = 4 > num2 = 6 > num1.send(operator,num2) > which returns 24 Ok, I see, so in Ruby, numbers can receive a 'multiply' message. This can happen in Python too, although it's really not quite Pythonic: ### >>> num1 = 4 >>> num1.__mul__(6) 24 ### Numbers in Python do have a fixed list of methods that they respond to: http://www.python.org/doc/ref/numeric-types.html but most Python numeric code will just use infix operators on numbers and avoid an explicit message-passing style. Best of wishes to you! _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor