Things That Newcomers to Ruby Should Know

Hi,

I have also updated the list at
http://www.glue.umd.edu/~billtj/ruby.html, which is the HTML version
of the list below.

I am sorry that our NNTP server was down since last Thursday morning
(10/3/02) and even until now they are still working on it. So I will
be “crippled” for a while and will not be able to follow the
discussions in almost real time (as the Google groups is about 30
minutes to one hour delay (?) as compared to the “tin” reader that I
use.) I have not seen many e-mails either, so probably our email
server is also affected.

In particular, it seems that the Google poster does not really support
80 column (or around that number) text, so some of the lines below are
wrapped around, which make them harder to read.

Regards,

Bill

···

=============================================================================
Things That Newcomers to Ruby Should Know

[1]Plain Text Format
* Resources:
+ HOME PAGE: [2]http://www.ruby-lang.org/en/
+ FAQ: [3]http://www.rubycentral.com/faq/
+ PITFALL:
[4]http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=pit
fall
+ ONLINE TUTORIAL/DOC/BOOK:
[5]http://www.rubycentral.com/book/
+ VERY USEFUL HINTS:
o “Programming Ruby” book by David Thomas and Andrew
Hunt,
“When Trouble Strikes” Chapter, "But It Doesn’t Work"
Section
o “The Ruby Way” book by Hal Fulton, Chapter 1: “Ruby
In
Review”

1. Use "ruby -w" instead of simply "ruby" to get helpful warnings.

If
not invoking “ruby” directly, you can set the environment
variable
RUBYOPT to ‘w’:
+ win32:
C:> set RUBYOPT=w
or
pressing F5 (to execute) in the Scite editor will give you
warnings
(and F4 will position at problematic line).
+ unix:
sh# export RUBYOPT="w"
or
csh# setenv RUBYOPT "w"
2. The notation “Klass#method” in documentation is used only to
represent an “instance method” of an object of class Klass; it
is
not a Ruby syntax at all. A “class method” in documentation, on
the other hand, is usually represented as “Klass.method” (which
is
a valid Ruby syntax).
3. Be aware of the lexical scoping interaction between local
variables and block local variables. If a local variable is
already defined before the block, then the block will use (and
quite possibly modify) the local variable; in this case the
block
does not introduce a new scope. Example:
(0…2).each do |i|
puts "inside block: i = #{i}"
end
puts “outside block: i = #{i}” # >> undefined `i’
On the other hand,
i = 0
(0…2).each do |i|
puts "inside block: i = #{i}“
end
puts “outside block: i = #{i}” # >> 'outside block: i =
2’
and
j = 0
(0…2).each do |i|
j = i
end
puts “outside block: j = #{j}” # >> 'outside block: j =
2’
4. The String#[Fixnum] method does not return the “character”
(which
is a string of length one) at the Fixnum position, but instead
the
ASCII character code at the position (however, this may change
in
the future). Currently, to get the character itself, use
String#[Fixnum,1] instead.
Furthermore, there are additional ASCII conversion methods such
as
+ Integer#chr to convert from the ASCII code to the
character
65.chr # >> “A”
+ ?char to convert from the character to the ASCII code
?A # >> 65
5. In Ruby, there are two sets of logical operators: [!, &&, ||]
and
[not, and, or]. [!, &&, ||]'s precedence is higher than the
assignments (=, %=, ~=, /=, etc.) while [not, and, or]'s
precedence is lower. Also note that while &&'s precedence is
higher than ||'s, the and’s precedence is the same as the or’s.
6. In the case statement
case obj
when obj_1

when obj_k

it is the “===” method which is invoked, not the “==” method.
Also, the order is “obj_k === obj” and not “obj === obj_k”.
The reason for this order is so that the case statement can
"match” obj in more flexible ways. Three interesting cases are
when obj_k is either a Module/Class, a Regexp, or a Range:
+ The Module/Class class defines the “===” method as a test
whether obj is an instance of the module/class or its
descendants (“obj#kind_of? obj_k”).
+ The Regexp class defines the “===” method as a test
whether
obj matches the pattern (“obj =~ obj_k”).
+ The Range class defines the “===” method as a test whether
obj is an element of the range (“obj_k.include? obj”).
7. Array.new(2, Hash.new) # >> [{}, {}]
but the two array elements are identical objects, not
independent
hashes.
8. After reading data from a file and putting them into variables,
the data type is really String. To convert them into numbers,
use
the “to_i” or “to_f” methods. If, for example, you use the "+“
operator to add the “numbers” without calling the conversion
methods, you will simply concatenate the strings.
An alternative is to use “scanf”
([6]http://www.rubyhacker.com/code/scanf).
9. It is advisable not to write some white space before the
opening
’(’ in a method call; else, Ruby with $VERBOSE set to true may
give you a warning.
10. The “dot” for method call is the strongest operator. So for
example, while in some other languages the number after the dot
in
a floating point number is optional, it is not in Ruby. For
example, “1.e6” will try to call the method “e6” of the object
1
(which is a Fixnum). You have to write “1.0e6”.
However, notice that although the dot is the strongest
operator,
its precedence with respect to method name may be different
with
different Ruby versions. At least in Ruby 1.6.7, “puts
(1…3).length” will give you a syntax error; you should write
"puts((1…3).length)” instead.
11. Be careful when using “mutable” objects as hash keys. To get
the
expected result, call Hash#rehash before accessing the hash
elements. Example:
s = "mutable"
arr = [s]
hsh = { arr => “object” }
s.upcase!
p hsh[arr] # >> nil (maybe not what was expected)
hsh.rehash
p hsh[arr] # >> “object"
12. In Ruby, only false and nil are considered as false in a
Boolean
expression. In particular, 0 (zero), “” or ‘’ (empty string),
[]
(empty array), and {} (empty hash) are all considered as true.
13. There is no standard, built-in deep copy in Ruby. One way to
achieve a similar effect is by serialization/marshalling.
Because
in Ruby everything is a reference, be careful when you want to
"copy” objects, especially for objects that contain other
objects
(such as arrays and hashes) and when the containment is more
than
one level deep.
14. “0…k” represents a Range object, while “[0…k]” represents an
array with a single element of type Range. For example, if
[0…2].each do |i|
puts "i = #{i}"
end
does not give what you expect, probably you should have written
(0…2).each do |i|
puts "i = #{i}"
end
or
0.upto(2) do |i|
puts "i = #{i}“
end
instead. Note also that Ruby does not have objects of type
"Tuple”
(which are immutable arrays) and parentheses are usually put
around a Range object for the purpose of precedence grouping
(as
the “dot” is stronger than the “dot dot” in the above example).

Things That Are Good to Know :slight_smile:

1. In Ruby the "self assignment operator" goes beyond "+=, -=, *=,
   /=, %=". In particular, operators such as "||=" also exist.

Please
see Table 18.4 in the “Programming Ruby” book for the complete
list.
2. If you do extensive numerical computations, you may consider
using
"Numerical Ruby"
([7]http://www.ir.isas.ac.jp/~masa/ruby/index-e.html).
3. If you have numerical arrays which consume a large amount of
memory and CPU time, you may consider using “NArray” which is
part
of the Numerical Ruby
([8]http://www.ir.isas.ac.jp/~masa/ruby/na/SPEC.en).
4. If you do integration between Ruby and C/C++, you may consider
using “SWIG” ([9]http://www.swig.org/).
5. If you do a lot of translation from Ruby to C, you may consider
using “rb2c”
([10]http://easter.kuee.kyoto-u.ac.jp/~hiwada/ruby/rb2c/).
6. If you want to speed up some parts of your Ruby code by writing
them in C, you may consider using “Inline”
([11]http://sourceforge.net/projects/rubyinline/).

 * For comments on this list, you may e-mail me directly at
   [12]billtj@glue.umd.edu.
 _________________________________________________________________

Last updated: Oct 7, 2002.
This list itself is available at
[13]http://www.glue.umd.edu/~billtj/ruby.html.
The plain text format is produced from the HTML format with “lynx
-dump”.
_________________________________________________________________

References

  1. file://localhost/.automount/tulsi/home/tjb/Conf/ruby.txt
  2. http://www.ruby-lang.org/en/
  3. http://www.rubycentral.com/faq/
  4. http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=pitfall
  5. http://www.rubycentral.com/book/
  6. http://www.rubyhacker.com/code/scanf
  7. http://www.ir.isas.ac.jp/~masa/ruby/index-e.html
  8. http://www.ir.isas.ac.jp/~masa/ruby/na/SPEC.en
  9. http://www.swig.org/
  10. http://easter.kuee.kyoto-u.ac.jp/~hiwada/ruby/rb2c/
  11. http://sourceforge.net/projects/rubyinline/
  12. mailto:billtj@glue.umd.edu
  13. http://www.glue.umd.edu/~billtj/ruby.html

“Bill Tj” billtj@glue.umd.edu wrote in message
news:f121f7e.0210070651.6982f8fb@posting.google.com

Hi,

I have also updated the list at
http://www.glue.umd.edu/~billtj/ruby.html, which is the HTML version
of the list below.

Some of the wiki pitfall pages are located on a japanese server. The html
source indicates a japanese encoding, while in fact the text is in UTF-8,
causing backslash to be displayed incorrectly.

Mikkel

Hello Bill,

Monday, October 07, 2002, 7:12:31 PM, you wrote:

  1. There is no standard, built-in deep copy in Ruby. One way to
    achieve a similar effect is by serialization/marshalling.
    Because
    in Ruby everything is a reference, be careful when you want to
    “copy” objects, especially for objects that contain other
    objects
    (such as arrays and hashes) and when the containment is more
    than
    one level deep.

may be changed to:

ruby vars holds references to objects and ‘=’ operator copies these
references:

a=‘x’
b=a
a << ‘y’

now both a and b points to string containing ‘xy’

parameters to methods and closures also passed as references to actual
objects. in order to get new, unbounded copy of variable value, you
can use “dup” method:

a=‘x’
b=a.dup

it may be advisable to see whether you modify existing object or
create new one. as a rule of thumb is

  1. methods ending with ‘!’ modifies value in place
  2. almost all other methods creates new objects
  3. ‘x+=b’, ‘x*=b’ and other assignment operators is internally translated
    into ‘x=x+b’ and so on, so these operators assign to x reference to
    newly created object
···


Best regards,
Bulat mailto:bulatz@integ.ru

Ruby has no pre/post increment operator!

x++ or x-- will fail to parse.

++x and --x will do nothing, infact they behave as multiple unary prefix
operators.

-x is the same as —x is the same as -----x and so on.

Ruby is not C, C++ or Java

This is OT, but just to show you I have nothing against you, I’d like to
say that I do appreciate constructive posts (as that one), and the only
thing I did dislike was you being so “aggresive” some times. But by your
name it seems English is not your native language (nothing wrong about
that, it’s not mine either :slight_smile: so perhaps it’s all a linguistic
misunderstanding.

BTW, the list is available in the Wiki too

you might edit it if you like.

[Bill, have you seen the Wiki or not? It’s gonna save you time, really :-)]

Regards,

···

On Wed, Oct 09, 2002 at 06:50:48PM +0900, Bulat Ziganshin wrote:

Hello Bill,

Monday, October 07, 2002, 7:12:31 PM, you wrote:

  1. There is no standard, built-in deep copy in Ruby. One way to
    achieve a similar effect is by serialization/marshalling.
    Because
    in Ruby everything is a reference, be careful when you want to
    “copy” objects, especially for objects that contain other
    objects
    (such as arrays and hashes) and when the containment is more
    than
    one level deep.
    may be changed to:


_ _

__ __ | | ___ _ __ ___ __ _ _ __
'_ \ / | __/ __| '_ _ \ / ` | ’ \
) | (| | |
__ \ | | | | | (| | | | |
.__/ _,
|_|/| || ||_,|| |_|
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

abuse me. I’m so lame I sent a bug report to debian-devel-changes
– Seen on #Debian

Hi,

From: MikkelFJ [mailto:mikkelfj-anti-spam@bigfoot.com]
Sent: Tuesday, October 08, 2002 1:53 AM

I have also updated the list at
http://www.glue.umd.edu/~billtj/ruby.html, which is the HTML version
of the list below.

Some of the wiki pitfall pages are located on a japanese
server. The html
source indicates a japanese encoding, while in fact the text
is in UTF-8,
causing backslash to be displayed incorrectly.

http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=pitfall

I told Seki-san who maintains rwiki.jin.gr.jp and tried
to avoid this problem. The server returned
Content-type: text/html; charset=EUC-JP
because pages may contains Japanese. Now it should return
Content-type: text/html; charset=us-ascii
when the page does not contain any 8bit chars.

Can your browser show backslashes correctly?

Regards,
// NaHi

Hi Peter,

Thanks for the input. I think the pre operators are really valid
concerns, because it may take a while to figure that out when a code
“behaves badly”.

Regards,

Bill

···

===========================================================================
Peter Hickman peter@semantico.com wrote:

Ruby has no pre/post increment operator!

x++ or x-- will fail to parse.

++x and --x will do nothing, infact they behave as multiple unary prefix
operators.

-x is the same as —x is the same as -----x and so on.

Ruby is not C, C++ or Java

Hello Peter,

Thursday, October 10, 2002, 8:03:09 PM, you wrote:

Ruby has no pre/post increment operator!

better variant:

Ruby has no pre/post increment operator! instead of “++x”, “–x” use
“x+=1”, “x-=1”

···


Best regards,
Bulat mailto:bulatz@integ.ru

parameters to methods and closures also passed as references to actual
objects. in order to get new, unbounded copy of variable value, you
can use “dup” method:

a=‘x’
b=a.dup

But this is for one deep.
Consider the following (not oneliner, but at least no comment :slight_smile:

s=‘tell’ # => “tell”
a=[s,s] # => [“tell”, “tell”]
b=a.dup # => [“tell”, “tell”]
c=Marshal.load(Marshal.dump(a)) # => [“tell”, “tell”]
s[0]=?h # => 104
a # => [“hell”, “hell”]
b # => [“hell”, “hell”]
c # => [“tell”, “tell”]

Gergo

±[Kontra, Gergely @ Budapest University of Technology and Economics]-+

    Email: kgergely@mcl.hu,  kgergely@turul.eet.bme.hu          |

URL: turul.eet.bme.hu/~kgergely Mobile: (+36 20) 356 9656 |
±------“Olyan langesz vagyok, hogy poroltoval kellene jarnom!”-------+
.
Magyar php mirror es magyar php dokumentacio: http://hu.php.net

  1. ‘x+=b’, ‘x*=b’ and other assignment operators is internally translated
    into ‘x=x+b’ and so on, so these operators assign to x reference to
    newly created object

If this is true, a+=1 creates a new object. Can’t it be avoided?

±[Kontra, Gergely @ Budapest University of Technology and Economics]-+

    Email: kgergely@mcl.hu,  kgergely@turul.eet.bme.hu          |

URL: turul.eet.bme.hu/~kgergely Mobile: (+36 20) 356 9656 |
±------“Olyan langesz vagyok, hogy poroltoval kellene jarnom!”-------+
.
Magyar php mirror es magyar php dokumentacio: http://hu.php.net

BTW, the list is available in the Wiki too
http://www.rubygarden.org/ruby?ThingsNewcomersShouldKnow
you might edit it if you like.

[Bill, have you seen the Wiki or not? It’s gonna save you time, really :-)]

Regards,
[batsman]

The Wiki is good, but Bill is the maintainer for the newcomers’ list, so he
should make the changes.

Bill, just restating that I think you should post the list to -talk once a
month so that it stays “on the radar” as far as newcomers are concerned.

Gavin

···

From: “Mauricio Fernández” batsman.geo@yahoo.com

Hello Mauricio,

Wednesday, October 09, 2002, 10:14:38 PM, you wrote:

  1. There is no standard, built-in deep copy in Ruby. One way to
    BTW, the list is available in the Wiki too
    http://www.rubygarden.org/ruby?ThingsNewcomersShouldKnow
    you might edit it if you like.

well, i changed this to text below. but i think it is better described
as “things that newcomers don’t want to know” :slight_smile: TOO MUCH

  1. ruby variables holds references to objects and ‘=’ operator copies these references:

a=‘x’
b=a
a.upcase!

now both a and b points to string containing ‘X’

parameters to methods and closures also passed as references to actual objects. in order to get new, unbounded copy of variable value, you can use “dup” method:

a=‘x’
b=a.dup

it may be advisable to know whether you modify existing object or
create new one. as a rule of thumb is

  1. methods ending with ‘!’ modifies value in place
  2. almost all other methods creates new objects
  3. ‘x+=b’, ‘x*=b’ and other assignment operators is internally translated into ‘x=x+b’ and so on, so these operators assign to x reference to newly created object

arrays, hashes and other containers also holds references. so, for example

a =
a[1] = s = ‘word’
s.upcase!
puts a[1] #=> ‘WORD’

one notable exception is what KEY (but not value) of hash is copied from original value (using #clone ?)

interesting (and may be undesirable) effect is parameters to some methods which will be BOTH used several times and each copy may be modified: Array.new(Fixnum,Object), Array#fill, Hash.new(Object). These methods will assign the same pointer to several cells in hash/array and then changing value thorough one pointer will be seen in all these cells:

a =
a.fill(‘x’,0,2)
a[0].upcase!
p a

···


Best regards,
Bulat mailto:bulatz@integ.ru

“NAKAMURA, Hiroshi” nahi@keynauts.com wrote in message
news:003501c27036$e0156a80$85222fc0@sarion.co.jp…

Some of the wiki pitfall pages are located on a japanese
server. The html
source indicates a japanese encoding, while in fact the text
is in UTF-8,
causing backslash to be displayed incorrectly.

http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=pitfall

I told Seki-san who maintains rwiki.jin.gr.jp and tried
to avoid this problem. The server returned
Content-type: text/html; charset=EUC-JP
because pages may contains Japanese. Now it should return
Content-type: text/html; charset=us-ascii
when the page does not contain any 8bit chars.

In us-ascii I can’t write my name: Mikkel Fahnoe Jorgensen (In case it
doesn’t display, the letter after ‘hn’ and after ‘J’ is similar to lower
case of the empty set symbol, and is sometimes written ‘oe’ in ASCII).

If the choice is between western european iso-latin-1 and EUC-JP, the
latter is a fair choice on a japenese server. UTF-8 is a better choice
because it allows both japanese and european texts.

Can your browser show backslashes correctly?

The following link contains and displays backslashes correctly.

http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=pitfall%3A%3ABackslas
h

However, it’s strange - source type appears to be xml, not html, and content
type is still euc-jp and lang=jp (but now in xml)

The other pitfall link quotet above works the same way, but it contains no
backslashes, so it is less interesting.

Mikkel

Bulat Ziganshin wrote:

Hello Peter,

Thursday, October 10, 2002, 8:03:09 PM, you wrote:

Ruby has no pre/post increment operator!

better variant:

Ruby has no pre/post increment operator! instead of “++x”, “–x” use
“x+=1”, “x-=1”

The lack of pre/post increment operators is a fact of life for
programmers comming to Ruby from C, C++ and Java. The fact that it can
parse without error leads them to get very confused and wonder why
their code doesn’t seem to work.

The x+=1 and x-=1 constructs can only be used as prefix operators, as in:

irb(main):007:0> x = 3
3
irb(main):008:0> (x+=1) * 2
8
irb(main):009:0> x
4

And if you are used to typing ++ or – then you are not going to be
convinced with a “better variant” type of argument.

Maybe we need a rubylint package?

Very interesting observation, Gergely. If it is true, like you said, then
probably Ruby internal implementation in C can further be optimized. (We
deal with this kind of issue all the time in C++, don’t we? I mean,
isn’t that the “+” operator and the “+=” operator invoke two different
functions in C++?)

Regards,

Bill

···

==========================================================================
Kontra, Gergely kgergely@mlabdial.hit.bme.hu wrote:

  1. ‘x+=b’, ‘x*=b’ and other assignment operators is internally translated
    into ‘x=x+b’ and so on, so these operators assign to x reference to
    newly created object

If this is true, a+=1 creates a new object. Can’t it be avoided?

Hi –

  1. ‘x+=b’, ‘x*=b’ and other assignment operators is internally translated
    into ‘x=x+b’ and so on, so these operators assign to x reference to
    newly created object

If this is true, a+=1 creates a new object. Can’t it be avoided?

In the case of numbers, it doesn’t create a new object, because
numbers are only instantiated once (if that’s the right way to put
it), as well as immutable. (You can’t do 3 << 1 etc.)

So when you do:

a = 3
a += 1

the only thing it can mean is: a = a+1

With other things, e.g. Strings, += does create a new object. I think
the reasoning is: since += has to behave like an assignment for
numbers, it should do so consistently. This means that the “creates a
new object” part is not consistent, but it really can’t be anyway.

David

···

On Sat, 12 Oct 2002, Kontra, Gergely wrote:


David Alan Black
home: dblack@candle.superlink.net
work: blackdav@shu.edu
Web: http://pirate.shu.edu/~blackdav

If I understand my maths correctly: numbers always exist, they are neither
created nor destroyed :slight_smile:

Actually,

a=1 # a is a reference to the number 1 (object of class Fixnum)
a+=1 # a is now a reference to the number 2

However in practise this is efficient, since there appears to be a very
compact internal representation of references to Fixnums:

irb(main):001:0> 0.id
1
irb(main):002:0> 1.id
3
irb(main):003:0> 2.id
5

So I don't think that an object representing "the number 2" is actually
allocated on the heap, thankfully :slight_smile:

Hence "a+=1" does not increment the object pointed to by 'a' (you can't
increment the number 1, it's meaningless); rather, 'a' is changed to
reference a new object which is the result of applying method +(1) to the
original object.

If 'a' references any other type of object, then 'a+=1 creates a new object'
is surely the desired behaviour?

   a += 1 is shorthand for
   a = a + 1 which is shorthand for
   a = a.+(1)

and in the general case you can't say that the method '+' when applied to
the object referred to by 'a' returns an object of the same class - and even
if it does, changing the original object in-situ is probably not what you
want anyway.

For example:

a="fred"
b=a
a+=" flintstone"

leaves 'b' pointing to the original string object ("fred") whilst 'a'
references to a new object.

Regards,

Brian.

···

On Sat, Oct 12, 2002 at 01:05:26AM +0900, Kontra, Gergely wrote:

>3) 'x+=b', 'x*=b' and other assignment operators is internally translated
>into 'x=x+b' and so on, so these operators assign to x reference to
>newly created object

If this is true, a+=1 creates a new object. Can't it be avoided?

Hello Gergely,

Friday, October 11, 2002, 7:41:09 PM, you wrote:

parameters to methods and closures also passed as references to actual
objects. in order to get new, unbounded copy of variable value, you
can use “dup” method:

a=‘x’
b=a.dup

But this is for one deep.

sorry, i misread documentation. you are right

···


Best regards,
Bulat mailto:bulatz@integ.ru

Hello Gergely,

Friday, October 11, 2002, 8:05:26 PM, you wrote:

  1. ‘x+=b’, ‘x*=b’ and other assignment operators is internally translated
    into ‘x=x+b’ and so on, so these operators assign to x reference to
    newly created object

If this is true, a+=1 creates a new object. Can’t it be avoided?

what you mean? if you want to increment in place, use another
operations, like “succ!”. btw, integers are saved w/o references, so
for Fixnum this question is without sense

···


Best regards,
Bulat mailto:bulatz@integ.ru

Hi Mauricio, Gavin, Bulat,

Thanks for all the inputs. I have seen the Wiki and it looks pretty
good. I think I will wait for a while for the list to stabilize,
before making changes to the Wiki, as I prefer not to maintain two
similar documents. (Probably once I get really familiar with the
Wiki, I will make it as the source; however, currently I am more
comfortable of editing an HTML document directly.)

Probably not everyone will agree, but I intend to keep the list as
minimal as possible, so that a person can finish reading it in
probably less than 15 minutes. With that, as the title implies also,
the list is more about preventing errors than about optimization.
Therefore, I have put some “extra” things under separate sub-heading
“Things That Are Good to Know :-)”.

One question, if I just post the list to comp.lang.ruby, is it also
echoed to -talk, or is it the other way around? (I don’t subscribe to
-talk as I don’t have big e-mail box.)

Regards,

Bill

···

=============================================================================
“Gavin Sinclair” gsinclair@soyabean.com.au wrote in message news:0f4b01c26ff2$8aa76470$526332d2@nosedog

From: “Mauricio Fernández” batsman.geo@yahoo.com

BTW, the list is available in the Wiki too
http://www.rubygarden.org/ruby?ThingsNewcomersShouldKnow
you might edit it if you like.

[Bill, have you seen the Wiki or not? It’s gonna save you time, really :-)]

Regards,
[batsman]

The Wiki is good, but Bill is the maintainer for the newcomers’ list, so he
should make the changes.

Bill, just restating that I think you should post the list to -talk once a
month so that it stays “on the radar” as far as newcomers are concerned.

Gavin