Forum: Ruby module_eval: create method that contains value passed to it?

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.
Henrik (Guest)
on 2006-01-07 21:48
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
James B. (Guest)
on 2006-01-07 23:34
(Received via mailing list)
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
Robert K. (Guest)
on 2006-01-08 00:44
(Received via mailing list)
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@(irb):3>
>> x.get_foobar
=> "qwert"

Kind regards

    robert
unknown (Guest)
on 2006-01-10 02:23
(Received via mailing list)
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
===============================================================================
This topic is locked and can not be replied to.