Forum: Ruby local variable and closure

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Schüle Daniel (Guest)
on 2006-02-02 00:09
(Received via mailing list)
Hello,

below is one little script that fails at ### <<< line
the output is

Animal has properties
Animal will be speakable
Dog has properties
Dog will be speakable
Duck has properties
Duck will be speakable
../dort.rb:16:in `speak': undefined local variable or method `msg' for
#<Dog:0x401d8da0> (NameError)
         from ./dort.rb:44

I would think that (passed to function) local variable msg would be
"closed" in self.class_eval {} closure and therefor be accessable

can someone point out why it doesn't work?

Regards, Daniel


#!/usr/bin/env ruby

$prop = {}

def prop
	puts "#{self.name} has properties"
	self.class_eval do
		$prop[self] = []
	end
end

def speakable(msg)
	puts "#{self.name} will be speakable"
	self.class_eval do
			$prop[self] << "I can speak"
			def speak;msg;end		### <<<
	end
end

class Animal
	prop
	speakable "..."
	def whatCanIDo;$prop[self.class];end
	def self.whatCanIDo;$prop[self];end
end

class Dog < Animal
	prop
	speakable "wuff"
end

class Duck < Animal
	prop
	speakable "quak"
end

a = Dog.new
b = Duck.new

puts a.speak, b.speak
Robert K. (Guest)
on 2006-02-02 00:09
(Received via mailing list)
Schüle Daniel wrote:
> Duck will be speakable
>
> end
> prop
> class Duck < Animal
> prop
> speakable "quak"
> end
>
> a = Dog.new
> b = Duck.new
>
> puts a.speak, b.speak

Without looking too close at your code: def has special scoping rules.
You better try to use define_method:

def speakable(msg)
  class_eval do
    # ...
    define_method(:speak) msg end
  end
end

HTH

Btw, what are you trying to accomplish?  Somehow I have the feeling that
your code might be more complex than needed.  Especially the use of a
global variable irritates me.

Kind regards

    robert
Schüle Daniel (Guest)
on 2006-02-02 00:12
(Received via mailing list)
Hello Robert,

> Btw, what are you trying to accomplish?  Somehow I have the feeling that
> your code might be more complex than needed.  Especially the use of a
> global variable irritates me.

complexity was the intention of my code :)
no really, I am playing with metaprogramming, also I wanted to know how
to implement own functions like "attr_accessor"
btw is there special name for this kind of functions?
functions that are executed in the class scope and can refer with "self"
to the class they are inside.

Regards, Daniel
Robert K. (Guest)
on 2006-02-02 00:19
(Received via mailing list)
Schüle Daniel wrote:
> Hello Robert,
>
>> Btw, what are you trying to accomplish?  Somehow I have the feeling
>> that your code might be more complex than needed.  Especially the
>> use of a global variable irritates me.
>
> complexity was the intention of my code :)

:-)

> no really, I am playing with metaprogramming, also I wanted to know
> how to implement own functions like "attr_accessor"

One way:

class Module
  def i_am_in_class_scope(*a)
    p a
  end
end

>> class Foo
>> i_am_in_class_scope :foo, :bar
>> end
[:foo, :bar]
=> nil


> btw is there special name for this kind of functions?
> functions that are executed in the class scope and can refer with
> "self" to the class they are inside.

I'd call them "class instance methods".

Kind regards

    robert
This topic is locked and can not be replied to.