From: Martin DeMello Date: 2010-07-14T19:48:09+09:00 Subject: Re: I have some questions about this modified String class On Wed, Jul 14, 2010 at 3:26 PM, Abder-Rahman Ali wrote: > I have the following script that I just have only slight changes in the > hash from "Why's poignant guide to Ruby" book: > > http://pastie.org/private/ojmcfglofwloqemqmuhra pasting it inline: class String @@syllables = [{'P' => 'Px','G' => 'Gx','B' => 'Bx','S' => 'Sx','W' => 'Wx','O' => 'Ox'}, {'R' => 'Rx','C' => 'Cx'}] def name_significance parts = self.split('-') # 'self' returns the current object. And, 'split' here means splitting based on (-) syllables = @@syllables.dup signif = parts.collect do |p| syllables.shift[p] end signif.join( ' ' ) end end Your problem is the call to syllables.shift - it removes one element from syllables and returns it. But it does this once per hyphen, and syllable only has two elements, so when you say > puts "Abder-Rahman-is-my-name".name_significance the first time through the loop, you have: p = Abder syllables.shift = {"P"=>"Px", "G"=>"Gx", "B"=>"Bx", "S"=>"Sx", "W"=>"Wx", "O"=>"Ox"} syllables.shift[p] = the second time through you have: p = Rahman syllables.shift = {"R"=>"Rx", "C"=>"Cx"} syllables.shift[p] = the third time: p = is syllables.shift = nil s.rb:10:in `block in name_significance': undefined method `[]' for nil:NilClass (NoMethodError) > 2- How can I use the @@syllables? Or, more specific, what is the use of > @@syllables here while I conclude that the purpose of this modification > to the class String is to remove '-'? > > 3- Why all that code if the purpose is removing '-', such that we ONLY > need self.split( '-' ) in the body of name_significance here? I have no idea what this code is intended to do :) What it does do is take in a string like "P-C" and return "Px Cx". Here's the code with print statements: class String @@syllables = [{'P' => 'Px','G' => 'Gx','B' => 'Bx','S' => 'Sx','W' => 'Wx','O' => 'Ox'}, {'R' => 'Rx','C' => 'Cx'}] def name_significance parts = self.split('-') # 'self' returns the current object. And, 'split' here means splitting based on (-) syllables = @@syllables.dup signif = parts.collect do |p| s = syllables.shift puts "p = #{p}" puts "syllables.shift = #{s.inspect}" puts "syllables.shift[p] = #{s[p]}" s[p] end signif.join( ' ' ) end end puts "P-C".name_significance martin