Ruby For Rails class_eval question

When I run the following example on page 349, I get the error message:

NoMethodError: undefined method `some_method’ for #<C:0x2e3d698 @x=1>
from (irb):94
from ?:0

c = Class.new
c.class_eval do
def some_method
puts “Created in class_eval”
end
end
c = C.new
c.some_method

How to run this example? I followed the suggestion on the Manning’s
errata page with no luck. TIA.
A.

It works now. Why does it have to be constant?

Bala P. <bparanj@…> writes:

c = Class.new
Your non-capitalization above is incorrect. The new class should be a
constant.
Try C = Class.new
c.class_eval do

def some_method
puts “Created in class_eval”
end
end
c = C.new
Well, you haven’t defined C because of the capitalization issue above.
c.some_method

Bala P. wrote:

It works now. Why does it have to be constant?

It doesn’t really have to be. It’s just a convention that classes are
defined into constants.

You can just as easily do:

x = Class.new
x.class_eval do
def some_method
puts “Created in class_eval”
end
end
c = x.new
c.some_method

The reason your first example failed was b/c you were inconsistently
mixing ‘c’ and ‘C’.

Hi –

On Tue, 10 Oct 2006, Bala P. wrote:

puts “Created in class_eval”
end
end
c = C.new
c.some_method

How to run this example? I followed the suggestion on the Manning’s errata page with no luck. TIA.

The erratum has an erratum… The two lines I provided are run
together into one. They should be split, as below.

The whole thing should be:

c = Class.new
c.class_eval do
def some_method
puts “Created in class_eval”
end
end

c_instance = c.new
c_instance.some_method

David


David A. Black | [email protected]
Author of “Ruby for Rails” [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB’s Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

Hi –

On Wed, 11 Oct 2006, Kian Wright wrote:

x.class_eval do
def some_method
puts “Created in class_eval”
end
end
c = x.new
c.some_method

The reason your first example failed was b/c you were inconsistently
mixing ‘c’ and ‘C’.

My fault – it was wrong in the first printing, and the erratum has
two lines run together as one. (See my other reply on this thread for
the working version.)

David


David A. Black | [email protected]
Author of “Ruby for Rails” [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB’s Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org