Closures defined inside a class method

This is just weird…

class ClassA
def self.func1
def func2
puts “In func2”
end
func2
end
end

ClassA.func1
=> NameError: undefined local variable or method `func2’ for
ClassA:Class

I can call other class methods without explicitly referencing the class
first due to the fact the call is made in class scope, so why can’t I
define
a method in class scope without explicitly prefixing it with ‘self’?

Also…

class ClassB
def self.func1
def func2
puts “In func2”
end
end
end

a = ClassB.new
a.func2
=> “In func2”

func2 looks as though it’s defined as a closure inside class scope func1
(though it isn’t ^^^^), yet I can call it on an instance of the class?

Someone please explain!

On Fri, Sep 14, 2007 at 12:04:55AM +0900, Ian L. wrote:

ClassA.func1
=> NameError: undefined local variable or method `func2’ for ClassA:Class

I think you want:

class ClassA
def self.func1
def self.func2
puts “In func2”
end
func2
end
end

In your example you defined an instance method func2, not a singleton
method func2, so you would need to create an instance in order to call
the method (it would be just as if the method definition for func2 were
outside func1).

func2 looks as though it’s defined as a closure inside class scope func1
(though it isn’t ^^^^), yet I can call it on an instance of the class?

It’s not a closure; func2 does not have access to the scope in which it
was defined.

Paul

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs