Newbie question: how to create variable

Hi,

how to create variable in the method that accepts string as name of the variable and the object?

Something like this:

class InterpreterCallback
    def set_object(name, value)
#do something here
    end
end

$callback = InterpreterCallback.new()
$callback.set_object("var", 3)

puts var

···

3

Karel Michek wrote:

Hi,

how to create variable in the method that accepts string as name of the variable and the object?

Something like this:

class InterpreterCallback def set_object(name, value)
#do something here

instance_variable_set("@#{name}", value)

    end
end

$callback = InterpreterCallback.new()
$callback.set_object("var", 3)

puts var

3

Alternatively you can use an OpenStruct.

Kind regards

  robert

Depending on what you're trying to do, you might be able to use a simple eval statement:
irb(main):001:0> name="var"
=> "var"
irb(main):002:0> value="3"
=> "3"
irb(main):003:0> eval "#{name} = value"
=> "3"
irb(main):004:0> var
=> "3"

···

On Aug 11, 2006, at 12:55 PM, Robert Klemme wrote:

Karel Michek wrote:

Hi,
how to create variable in the method that accepts string as name of the variable and the object? Something like this:
class InterpreterCallback def set_object(name, value)
#do something here

instance_variable_set("@#{name}", value)

    end
end
$callback = InterpreterCallback.new()
$callback.set_object("var", 3)
puts var

3

Hi --

···

On Sat, 12 Aug 2006, Mr Pinto wrote:

On Aug 11, 2006, at 12:55 PM, Robert Klemme wrote:

Karel Michek wrote:

Hi,
how to create variable in the method that accepts string as name of the variable and the object? Something like this:
class InterpreterCallback def set_object(name, value)
#do something here

instance_variable_set("@#{name}", value)

   end
end
$callback = InterpreterCallback.new()
$callback.set_object("var", 3)
puts var

3

Depending on what you're trying to do, you might be able to use a simple eval statement:
irb(main):001:0> name="var"
=> "var"
irb(main):002:0> value="3"
=> "3"
irb(main):003:0> eval "#{name} = value"
=> "3"
irb(main):004:0> var
=> "3"

That only works in irb. With ruby you'll get:

  ruby -e 'name="var"; value="3"; eval("#{name}=#{value}"); var'
   -e:1: undefined local variable or method `var' for main:Object
   (NameError)

David

--
http://www.rubypowerandlight.com => Ruby/Rails training & consultancy
   ----> SEE SPECIAL DEAL FOR RUBY/RAILS USERS GROUPS! <-----
http://dablog.rubypal.com => D[avid ]A[. ]B[lack's][ Web]log
Ruby for Rails => book, Ruby for Rails
http://www.rubycentral.org => Ruby Central, Inc.

------------ Původní zpráva ------------
Od: <dblack@wobblini.net>
Předmět: Re: newbie question: how to create variable
Datum: 12.8.2006 14:27:31
----------------------------------------
Hi --

>
>> Karel Michek wrote:
>>> Hi,
>>> how to create variable in the method that accepts string as name of the >>> variable and the object? Something like this:
>>> class InterpreterCallback >>> def set_object(name, value)
>>> #do something here
>> >> instance_variable_set("@#{name}", value)
>>> end
>>> end
>>> $callback = InterpreterCallback.new()
>>> $callback.set_object("var", 3)
>>> puts var
>>>>>> 3
>
> Depending on what you're trying to do, you might be able to use a simple eval

> statement:
> irb(main):001:0> name="var"
> => "var"
> irb(main):002:0> value="3"
> => "3"
> irb(main):003:0> eval "#{name} = value"
> => "3"
> irb(main):004:0> var
> => "3"

That only works in irb. With ruby you'll get:

  ruby -e 'name="var"; value="3"; eval("#{name}=#{value}"); var'
   -e:1: undefined local variable or method `var' for main:Object
   (NameError)

David

None of this actually works quite well for me. I am using SWIG directors to embed ruby (and python, perl) into C# application trough C++ layer. value actually wraps C++ object . InterpreterCallback actually extends c++ class and I am calling set_object() from C++ - set_object("editor", getEditor() ) - "editor" then can be used in the global namespace for scripting convenience:

editor.DrawGrid

I actually get it working with

    def set_object(var, value)
      eval("def #{var}; $#{var}; end; proc{|_v| $#{var} = _v}", TOPLEVEL_BINDING).call(value)
    end

but it goes through global variable. I believe there is simpler way how to do this.
Kind regards,
Karel

···

On Sat, 12 Aug 2006, Mr Pinto wrote:
> On Aug 11, 2006, at 12:55 PM, Robert Klemme wrote: