Module_eval: create method that contains value passed to it?


#1

This is a Rails example, but I think the problem is a general Ruby
matter.

I am using class_eval within a class method, foobar(), to have it create
an instance method, get_foobar(). I am passing a value (“testing testing
123”) to foobar() that I want to make part of get_foobar(). However, I
can’t seem to include this value in the output of get_foobar().

Where I want the “render” line to output “A start testing testing 123
end O”, it only outputs “A start end O”. Extremely grateful for any
help. Code:

class HelpController < ApplicationController

  def self.foobar(v)

    class_eval %q{
      def get_foobar()
        "start #{v} end"
      end
    }

  end

  foobar "testing testing 123"

   def index
    render :text => "A "+get_foobar+" O"
  end

end

Or syntax highlighted here: http://rafb.net/paste/results/igothN18.html


#2

Henrik wrote:

This is a Rails example, but I think the problem is a general Ruby
matter.

Perhaps, but it would be more helpful to isolate the problem by removing
all Rails influence, since there is every chance that Rails is munging
up core Ruby behavior.

But I think the problem is simply that you are not quoting your strings
correctly:

class HelpController
def self.foobar(v)
class_eval %Q{
def get_foobar()
“start #{v} end”
end
}
end

  foobar "testing testing 123"
   def index
    puts "A " + get_foobar + " O"
  end
end

HelpController.new.index # A start testing testing 123 end O

(Big Q, not little q)

I have no idea if this works on the railroad.

James

http://www.ruby-doc.org - Ruby Help & Documentation
http://www.artima.com/rubycs/ - Ruby Code & Style: Writers wanted
http://www.rubystuff.com - The Ruby Store for Ruby Stuff
http://www.jamesbritt.com - Playing with Better Toys
http://www.30secondrule.com - Building Better Tools


#3

Henrik removed_email_address@domain.invalid wrote:

end O", it only outputs “A start end O”. Extremely grateful for any
}

Or syntax highlighted here:
http://rafb.net/paste/results/igothN18.html

You don’t even need class_eval - a simple closure is sufficient:

class X
def self.foobar(x)
define_method(:get_foobar) { x }
end

foobar “testing testing 123”
end

x=X.new
=> #<X:0x101c1198>

x.get_foobar
=> “testing testing 123”

X.foobar “qwert”
=> #Proc:0x101c8530@:3(irb)

x.get_foobar
=> “qwert”

Kind regards

robert

#4

On Sun, 8 Jan 2006, Henrik wrote:

help. Code:

Or syntax highlighted here: http://rafb.net/paste/results/igothN18.html


Posted via http://www.ruby-forum.com/.

this can be done with closures or a storage/search-path scheme. the
traits
lib uses the latter, see here:

http://codeforpeople.com/lib/ruby/traits/

-a

===============================================================================
| ara [dot] t [dot] howard [at] noaa [dot] gov
| strong and healthy,
| who thinks of sickness until it strikes like lightning?
| preoccupied with the world,
| who thinks of death, until it arrives like thunder?
| – milarepa